2011-08-04 11 views
20

私はListViewのセットアップ用にカスタムアダプタを持っています。ボタンをクリックすると、基になるデータで何かが変更されるので、ListViewを更新するにはnotifyDataSetChangedが必要です。ファイン。しかし、私はまた、ListViewが変更が発生した行にスクロールしたい。このためには、smoothScrollToPositionをnotifyDataSetChangedの直後に呼び出します。そして、それは動作していません。smoothScrollToPosition notifyDataSetChangedがアンドロイドで動作していない

notifyDataSetChangedを呼び出さないと、スクロールが機能するので、notifyがスクロールをブロックします。私はおそらく将来イベントが処理されることになるだろう。誰かが間違っていることについて私にポインタを与えることができますか?

+1

少し。この現象は、エミュレータで発生します。電話で実行すると、状況は混ざります。時にはスクロールが動作し、ときには動作しません。滑らかさが行われる前に通知が完了しているかどうかは疑問です。あるいは、どのような順序でか。 – tbeernot

答えて

78

あなたがnotifyDataSetChanged()を呼び出した後の更新を完了するために、リストを待つpost()メソッドを使用します。

adapter.notifyDataSetChanged(); 
list.post(new Runnable() { 
    @Override 
    public void run() { 
    //call smooth scroll 
    } 
    }); 
+0

ありがとう!これは機能します。エミュレータでは、リストは最後までジャンプしてから先に移動するように指示されましたが、電話では表示されません。 – tbeernot

+0

理論的には、リストは 'notifyDatasetChanged()'の前と同じ位置にあるべきです。したがって、少ない要素でリフレッシュすると、効果的に最初に終了します。 – dmon

+0

トライアルでは、notifyDatasetChangedによってリストが常に下にジャンプすることが示され、smoothScrollToPositionによってエントリが一番上になるようにジャンプします。エミュレータではこれがはっきりと目に見えますが、実際の電話機ではリストは「落ち着きがなく」あり、何も必要ないときにはアクションがあります。 – tbeernot

0

私はDMONの例のコードを試みたと私はそれが常に動作していない参照してください。

は、実際に私はスクロールを実行するための別のアプローチを見つけた:

adapter.notifyDataSetChanged(); 
channelsListView.setSelection(scrollPos); // it works without smoothScrollToPositionFromTop(..) or smoothScrollToPosition() methods call. 

私はこの答えを読んだ後、上記の方法に使用する主なアイデアが見つかりました:追加情報の https://stackoverflow.com/a/20997828/2133585

関連する問題