CursorAdapter和滚动:visibleItemCount偶尔会变得很大

时间:2015-02-09 13:46:39

标签: android listview

我有ListViewCursorAdapter提供支持。 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取而代之,问题仍然存在。

1 个答案:

答案 0 :(得分:1)

问题是列表视图项的根元素的layout_height等于wrap_content。当视图中有许多项目时,这可能会导致列表视图中的一些性能问题(或者适配器,我不知道)。将layout_height更改为准确值可解决问题(并使列表滚动更顺畅):

layout_height="30dp"