7

ここでは、Twitterのフィードを表示する単純なリストビューがあります。私はsqliteからツイートを取得しているCursorAdapterを持っています。私がカーソル上でrequery()を呼び出すと、データベースに追加された新しいツイートが取得されることが期待されます。これはすべて正常に動作し、新しい項目は、ListViewでこれが発生した後でも表示されます。新しいアイテムが追加されたときにRequeryが呼び出された後、CursorAdapterを使用したAndroid ListViewのスクロール位置が正しくない

問題は、項目位置のオフセットに基づいてスクロール位置が保存されているようです。 ListViewの最初の表示位置が4であるとしましょう。クエリを再作成して2つの新しいアイテムがリストの先頭に追加されると、ListViewは最初に表示されるアイテムのスクロール位置を4に保ちますが、リストには2つの新しいアイテムがあります私はリフレッシュ前の位置とは異なる位置4に別のアイテムが表示されるようになりました。この画像は前後示す: enter image description here

注意をどのようにする前に、さえずるDは、最初に表示されるアイテムであり、その後、さえずるB現在、最初に表示項目となります。

私の質問は、この例では、ツイートDはまだ再クエリ後に最初に表示される項目になるように、私は、再クエリを呼び出すときに、カーソル位置決幅に基づいて、同じスクロール位置を維持しないか、でしょうか?

答えて

0

私の提案は、リスト内の項目の数を追跡することです。更新の一部として、古いカウントと新しいカウントの間に差を加えることができます。

擬コード

on_update

offset+= (list_view.length() - list_size) 
    list_size = list_view.length() 
3

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

リストを更新する前に、スクロール位置をこのように保存する -

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

そして、あなたがリストを更新した後、あなたが追加したどのように多くの項目を知っているだろう。だから、これで私の主な問題は、すべて私の項目が同じ高さではないということですので、このようにスクロールすると、アイテムが半分であれば、それは例えば、以前にあった「正確な」位置を取得することはできません

yourlistview.setSelectionFromTop(position + <number of items added>, top); 
+0

を呼び出すことができます可視... – Redth

+0

あなたはそれを試しましたか?私のリストでさえ変数の高さの行があるからです。しかし、完璧に動作します。 'int top = v == null? 0:v.getTop(); 'この部分は、項目が半分に見える場合に実際に処理されます。 – Enigma

関連する問題