我有一个由ListView驱动的CursorAdapterListView附加了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"

10-08 19:04