更改列表视图适配器后禁用快速滚动

时间:2014-03-09 20:20:35

标签: java android android-listview

我有一个启用了快速滚动的ListView:

mList.setFastScrollEnabled(true);

这非常有效。但是当我更换适配器时,我无法快速滚动。

mList.setAdapter(mAdapter);

我的适配器正确实现了getCount()。致电

  

mList.setFastScrollEnabled(真);

设置新适配器后,无法将android:fastScrollEnabled="true"添加到ListView XML。

有没有办法重新启用快速滚动?

1 个答案:

答案 0 :(得分:2)

在深入研究Android源代码后,我终于找到了解决方案:

    mAdapter = new ArrayAdapter....
    mList.setAdapter(mAdapter);

    // We have to post notifyDataSetChanged() here, so fast scroll is set correctly.
    // Without it, the fast scroll cannot get any child views as the adapter is not yet fully
    // attached to the view and getChildCount() returns 0. Therefore, fast scroll won't
    // be enabled.
    // notifyDataSetChanged() forces the listview to recheck the fast scroll preconditions.
    mList.post(new Runnable() {
        @Override
        public void run() {
            mAdapter.notifyDataSetChanged();
        }
    });

FastScroller.java有以下方法:

public void onItemCountChanged(int totalItemCount) {
    final int visibleItemCount = mList.getChildCount();

    ....

    updateLongList(visibleItemCount, totalItemCount);
}

调用setAdapter()时,FastScroller会重新检查启用快速滚动的条件。但由于尚未完全显示新适配器,mList.getChildCount()将返回零,而updateLongList()将无法启用快速滚动。

使用我的修复程序,ListView会在新适配器完全附加到视图后通知已更改底层数据,并且现在已满足快速滚动的前提条件。