我正在尝试使用Commonsware Endless Adapter(https://github.com/commonsguy/cwac-endless)进行无尽的listview,默认情况下工作正常。
我要做的是一个基本的聊天应用程序。 当用户滚动到顶部时,新项目应显示在最后,聊天历史记录应由无限适配器加载。
这本身并不难。如果ArrayAdapter包含数据s.t.最新的项目位于0位置,然后在ListView的XML声明中使用android:stackFromBottom
将列表的开头放在最后。
为了确保“加载更多”指示符位于顶部,我会覆盖getItem
,getView
等,为其提供反转位置(count-1-position
)。< / p>
我的问题:当EndlessAdapter在List的末尾添加新数据时,“load more”指示器仍然可见,导致它无休止地获取更多数据,直到无法再获取。 预计它会加载一个批次,然后用户需要向下滚动(此处:向上)以加载更多元素。
我错过了什么?
答案 0 :(得分:1)
就个人而言,我会考虑针对此方案进行pull-to-refresh,而不是EndlessAdapter
。
话虽如此,如果您看到其他行显示,但待处理视图仍然存在,则您修改的getView()
无法正常工作。出现的其他行表明notifyDataSetChanged()
本身正在运行(否则,这些行不会显示)。因此,如果仍然显示待处理视图,则getView()
可能正在返回待处理视图(位置0,我猜)。事实上,我不知道如何让反向EndlessAdapter
工作,因为第一行应该始终是待处理的视图,并且应该始终加载数据,直到你用完数据(在这种情况下)聊天,可能永远不会这样。)
因此,再次,我将使用pull-to-refresh,或者您将不得不切换到一个注意滚动事件的不同“无尽”方案,而不是仅仅等待待处理视图显示,作为获取更多数据的触发器。
答案 1 :(得分:0)
不关心notifyDataSetChanged()帮助。 我实现了一个适配器来返回Integer.MAX_VALUE作为元素的数量,特别是计算缓存中的索引。
以下是一些代码段:
<ListView
android:id="@+id/logContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stackFromBottom="true" />
......
logContainer.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if ((logAdapter.getCachedCount() - (Integer.MAX_VALUE - firstVisibleItem)) <= LINES_TO_TRIGGER_PRELOAD && !logAdapter.isPreloading()) {
logAdapter.preloadAtBackground();
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
});
class LogAdapter extends BaseAdapter {
private ArrayList<String> logList = new ArrayList<String>();
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView logLineView = new TextView(LogViewDialog.this);
int idx = logList.size() - (Integer.MAX_VALUE - position);
logLineView.setText(logList.get(idx));
return logLineView;
}
.........