我有一个启用了快速滚动的ListView:
mList.setFastScrollEnabled(true);
这非常有效。但是当我更换适配器时,我无法快速滚动。
mList.setAdapter(mAdapter);
我的适配器正确实现了getCount()。致电
mList.setFastScrollEnabled(真);
设置新适配器后,无法将android:fastScrollEnabled="true"
添加到ListView
XML。
有没有办法重新启用快速滚动?
答案 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
会在新适配器完全附加到视图后通知已更改底层数据,并且现在已满足快速滚动的前提条件。