9

私の問題: (カスタマイズされた) SimpleCursorAdapter を介してコンテンツを更新するたびに、ListView のスクロール位置が一番上にリセットされます。更新時に ListView のスクロール位置を維持したいと思います。

毎回新しいアダプタ インスタンスを作成して を使用することから始めましたが、この議論ListView.setAdapter()によると、アダプタをリセットするのではなく更新する必要があります。正しく動作する SimpleCursorAdapter に対してこれを行う方法が見つかりません。

メソッドの引数を省略して、私が試したいくつかのことを次に示します
。-SimpleCursorAdapter.changeCursorAndColumns()新しいカーソルを使用すると、アダプターは正常に更新されますが、スクロール位置はリセットされます。
-SimpleCursorAdapter.changeCursor()同じように動作します。
- SimpleCursorAdapter.swapCursor()api 11 までは利用できません。私は api 8 用に開発しています。
- SimpleCursorAdapter.notifyDataSetChanged()ListView を更新しません。(おそらく、私が見逃している別のステップがあります。)
- ListView.invalidate()ListView を更新しません。
- SimpleCursorAdapter.requery()ListView を空白にし、廃止予定です。
- 私はListView.setSelection()解決策に精通していますが、更新時に ListView をまったく動かしたくありません。これにより、リスト内の位置にスナップされます。

これは、一般的で単純な問題であるように思われます。誰かがそれに対処しましたか?

4

2 に答える 2

5

同様の問題がありました。カーソルの内容が変更されるたびに、CursorAdapter がスクロール位置をリセットしました。

データが変更されるたびに、実際に新しいリスト アダプターを設定していたことに気付きませんでした。カーソル自体がコンテンツの変更についてアダプターに通知すると思いましたが、私の場合、ListFragment で LoaderManager.LoaderCallbacks.onLoadFinished() をトリガーするのは ContentProvider です。そのコールバックで、新しいアダプターを作成する代わりに CursorAdapter.changeCursor() を使用すると、すべて正常に動作します。

これが問題の解決に役立つことを願っています。

于 2012-02-22T20:01:16.490 に答える
0

次のコードを使用した非同期タスクの実行後でも同じことができました

 Cursor cursor = mDataHelper.getWritableDatabase().query(
                        DataContract.Incares.TABLE_NAME,  // Table to Query
                        null, // all columns
                        null, // Columns for the "where" clause
                        null, // Values for the "where" clause
                        null, // columns to group by
                        null, // columns to filter by row groups
                        DataContract.Incares.UUID +" DESC" // sort order
                );
CursorAdapter.changeCursor(cursor);
CursorAdapter.notifyDataSetChanged();

CursorAdapter がグローバル変数である場合

于 2015-07-19T22:16:18.413 に答える