2

listfragmentのcursoradapterで発生している特有の問題。

onLoadFinishedで、リストビューを前の位置にスクロールする(そしてそのアイテムを強調表示する)ために、前に選択したアイテムを選択します。

これは、スクロール部分を除いて、見事に機能します。

投稿を1つだけ使用して遅延させると(たとえば5秒でも)、アイテムは選択されますが、リストはスクロールしません(選択したアイテムは現時点では表示されない可能性があります) 。遅延の有無にかかわらず、1つの投稿だけで同じ動作をします。

選択したアイテムが表示されるようにリストビューをスクロールするには、setSelectionAGAINを投稿する必要があります。

最初または2番目のスクロール投稿をどれだけ遅らせるかは関係ありません。

これが私の厄介な回避策ですが、私はそれに満足していません。何か案は?

@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

リライト:

それらをランナブルから削除すると、setselectionを1回呼び出すだけで機能します。ただし、(ユーザーにスクロールを表示するための)遅延スクロール効果は得られません。これは、私が好きだと思います。

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 に答える