ListView需要2个setSelection来滚动到项目

时间:2012-12-22 19:35:46

标签: android listview android-cursoradapter android-listfragment

我在listfragment中使用cursoradapter时遇到了一些特殊问题。

在我的onLoadFinished中,我选择之前选择的项目,以便将列表视图滚动到上一个位置(然后突出显示该项目)。

除了滚动部分之外,这非常有效。

如果我只使用一个帖子并延迟它(甚至比如5秒),则该项目会被选中,但列表不会滚动(此时所选项目可能不在视图范围内)使用或只有一个帖子,没有延迟相同的行为。

我必须发布setSelection AGAIN以使列表视图滚动,以便所选项目在视图中。

延迟初始或第二个滚动帖的时间并不重要。

这是我的肮脏的解决方法,但我对它不满意。有什么想法吗?

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    mAdapter.swapCursor(data);
    getListView().post(new Runnable() {
        @Override
        public void run() {
            getListView().requestFocusFromTouch();
            getListView().setSelection(selectedposition);
            getListView().performItemClick(getListView().getAdapter().getView(selectedposition, null, null), selectedposition, selectedid);
            getListView().clearFocus();
        }    
    });
    getListView().postDelayed(new Runnable() {
        @Override
        public void run() {
            getListView().requestFocusFromTouch();
            getListView().setSelection(selectedposition);
            getListView().performItemClick(getListView().getAdapter().getView(selectedposition, null, null), selectedposition, selectedid);
            getListView().clearFocus();
        }    
    }, 500);
}

1 个答案:

答案 0 :(得分:3)

重写:

  

如果我将它们从runnable中取出它只能调用setselection一次。然而,我没有得到延迟滚动效果(向用户显示它滚动),我想我有点喜欢。

当我仔细查看您的代码时,我注意到您手动调用了适配器中的getView()。适配器以非常特殊但不可预测的顺序回收他们的视图并试图自己调用getView()可能会产生不必要的行为......你应该避免这样做,尝试不同的策略:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    mAdapter.swapCursor(data); // or changeCursor(data) as explained below
    getListView().postDelayed(new Runnable() {
        @Override
        public void run() {
            ListView listView = getListView(); // Save a local reference rather than calling `getListView()` three times
            listView.setSelection(selectedposition);
            listView.performItemClick(listView.getChildAt(0), selectedposition, selectedposition);
        }
    }, 500);
}