上にスクロールするAndroidListView


80

私が持っているListViewカスタム行で。これらの行のいずれかをクリックすると、ListViewのデータが再生成されます。これが発生した場合、リストを一番上にスクロールして戻したいのですが。

私は最初に これを達成するためにsetSelection(0)各行で使用しようとしましOnClickListenerたが、失敗しました(ListView データが無効になるとスクロール位置が失われるため、setSelectionの呼び出しが取り消されます。ListViewがスクロール先を決定する方法がまだわかりませんただし、無効化後)。

私が知っている唯一の実用的な解決策は、ここでRomain Guyによって提供されました:http//groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

これにはView.post、への呼び出し()が含まれ_listView.setSelection(0)ます。これは非常にパフォーマンスが悪いことがわかりました。新しく生成されたリストは、スクロール位置が変更されていない状態で表示され、一番上にスクロールして戻るまでにかなりの遅延があります。

この機能を実現するためのより良い方法はありますか?

どんな助けでも大歓迎です。

ありがとう!

回答:


132

listView.setSelectionAfterHeaderView();上にスクロールするために呼び出す


66
それはまさに私がそれと呼んでいたものです。
markshiz 2012年

102

私はたくさん試しましたが、これは私のために働きました

list.smoothScrollToPosition(0);

3
これはすごいです。スクロール速度を変えてもらえませんか?
theblang 2013年

次の画面に移動できるように、scollがいつ終了するかを知るためのコールバックもありますか?
Amol Gupta 2014

41

私は単に使用します listview.setSelection(0);

私にとってはうまくいきます。


5

ListViewアダプタのデータが変更された直後にインスタントスクロールが必要な場合は、まだデータが入力されていない可能性があることに注意してください。この場合post()setSelection()またはsetSelectionAfterHeaderView()を介しHandlerて、後でキューで呼び出されるようにする必要があります。

listView.Handler.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionAfterHeaderView();    
            }
        });

これは私のために働いた。


4

個人的には、別のUIパターンを見つけることをお勧めします。ユーザーがあなたの現在の「クリック、そしてリストがその場で変わる」アプローチを直感的に感じる可能性はありますが、私は懐疑的です。

サブクラス化ListViewとオーバーライドlayoutChildren()を試してスーパークラスにチェーンし、setSelection(0)それが必要な場合に呼び出すことができます。「かなりの遅延」がpost()通話だけによるものである場合、これで問題が解決するはずです。


4
提案をありがとう、私はそれをすぐに試してみるつもりです。ブレッドクラムが画面の他の場所に表示されるため、リストはその場で変更されます。一般的なAndroid UIデザインは、私の特定のUI目標やターゲットユーザーにはあまり適していません。また、すべてのあなたの助けに感謝します-私はあなたのstackoverflowの答えとあなたのCommonsWareの文献の数を読みました、そしてそれらは私がこのプラットフォームで始めるのを大いに助けてくれました!
aakash 2010年

これはそれを行う方法であり、魔法の方法ではなく、純粋なロジックです。ありがとう!
レオはモニカチェッリオはサポート

2

回避策として、新しく再生成されたデータを含む新しいアダプターを作成してから、ListView.setAdapterを呼び出すことができます。その後、ListView.setSelection(n)を呼び出します。

ところで、commonswareによって提供されるソリューションが機能します。


2

いくつかの異なる要件について。チャット中と同じように上にスクロールしたい場合。

        mListView.smoothScrollToPosition(mAdapter.getCount());

1

これは、リストビューヘッダーから編集テキストにフォーカスする場合に正常に機能しました

listview.setSelectionFromTop(0,0);

リストビューから特定のインデックスビューを選択する場合は、

listview.setSelection(index); // o for top
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.