2

我在 listfragment 中使用 cursoradapter 时遇到的特殊问题。

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

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

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

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

我延迟第一个或第二个滚动帖子多长时间都没关系。

这是我肮脏的解决方法,但我对此并不满意。有任何想法吗?

@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);
}
4

1 回答 1

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);
}
于 2012-12-22T19:59:11.983 回答