7

シナリオは次のとおりです。Twitter フィードを表示する単純な ListView があります。sqlite からツイートを取得する CursorAdapter があります。カーソルで requery() を呼び出すと、データベースに追加された新しいツイートが取得されることを期待しています。これはすべて正常に機能し、これが発生した後、新しいアイテムは ListView でも表示されます。

問題は、アイテムの位置オフセットに基づいてスクロール位置が保存されているように見えることです。したがって、ListView の最初の表示位置が 4 であるとします。再クエリを実行して 2 つの新しい項目がリストの一番上に追加されると、ListView は最初に表示される項目のスクロール位置を 4 に保ちますが、リストには 2 つの新しい項目があるためです。 、更新前とは異なる項目が 4 位に表示されるようになりました。この画像は前後を示しています。 ここに画像の説明を入力

以前はツイート Dが最初に表示されるアイテムでしたが、その後、ツイート Bが最初に表示されるアイテムになっていることに注目してください。

私の質問は、再クエリを呼び出すときにカーソル位置に基づいて同じスクロール位置を維持するにはどうすればよいですか?

4

2 に答える 2

3

私のプロジェクトの1つで同様の問題がありました。これが私がそれを解決した方法です。まったく同じではありませんが。それが役に立てば幸い。

リストを更新する前に、この方法でスクロール位置を保存してください -

int position = getListView().getFirstVisiblePosition();
View v = getListView().getChildAt(0);
int top = v == null ? 0 : v.getTop();

リストを更新すると、追加したアイテムの数がわかります。だからあなたは呼び出すことができます

yourlistview.setSelectionFromTop(position + <number of items added>, top);
于 2013-01-10T13:46:21.707 に答える
0

私の提案は、リスト内のアイテムの数を追跡することです。それがわかったら、更新の一部として、古いカウントと新しいカウントの差を追加できます。

疑似コード

on_update

  offset+= (list_view.length() - list_size)
  list_size = list_view.length()
于 2013-01-10T13:32:12.873 に答える