我有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取而代之,问题仍然存在。
答案 0 :(得分:1)
问题是列表视图项的根元素的layout_height
等于wrap_content
。当视图中有许多项目时,这可能会导致列表视图中的一些性能问题(或者适配器,我不知道)。将layout_height
更改为准确值可解决问题(并使列表滚动更顺畅):
layout_height="30dp"