我有一个由ListView
驱动的CursorAdapter
。 ListView
附加了OnScrollListener
:
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
android.util.Log.e("===", "Scrolling: firstVisibleItem:" + firstVisibleItem + ", visibleItemCount:" + visibleItemCount + ", totalItemCount:" + totalItemCount);
//some logic here
}
});
当我向下滚动并到达列表的底部时,将从网络中获取新项目,将其添加到数据库中,并更新
CursorAdapter
的光标以刷新列表:adapter.changeCursor(newCursor); //the query for the cursor is always the same, it never changes
但是,当我向上滚动并到达列表的中间位置时,有时
visibleItemCount
参数设置为远远大于其通常值的值(40对通常7-8)。接下来是短暂的滞后,列表立即移回靠近底部的位置。我的CursorAdapter看起来像这样:
class MyCursorAdapter extends CursorAdapter {
//...
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = layoutInflater.inflate(R.layout.my_layout, parent, false);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
populateView(view, cursor);
}
private void populateView(View view, Cursor cursor) {
//...
//this does not move the cursor, only reads from it
}
}
难道我做错了什么?
编辑
实际上,该问题甚至与CursorAdapter都不相关,我已将其替换为常规的BaseAdapter,并且该问题仍然存在。
最佳答案
问题是列表视图项的根元素的layout_height
等于wrap_content
。当视图中有很多项目时,这可能会导致列表视图(或适配器,我不知道)内部出现一些性能问题。将layout_height
更改为确切值可以解决此问题(并使列表滚动更流畅):
layout_height="30dp"