リストビューリストを更新した後、リストの最後までスクロールします


292

listAdapterを使用してリストビューを更新した後、リストに入力された最後の要素が表示されるように、リストが一番下までスクロールされていることを確認します。これどうやってするの ?

私はこれを試しましたが運はありませんでした:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

ありがとうございました


これを試してみてください... messagesListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); messagesListView.setStackFromBottom(true);
Superdev 14

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL)は、adapter.notifyDataSetChangedを呼び出した後、listViewが下にスクロールされることのみを保証します。これが機能しない場合は、以下の投稿で確認できるように、このプロパティをxmlで定義してみてください。
トム

回答:


418

リストのデータがいつ変更されたかがわかっている場合、リストの選択を最後の行に設定することにより、リストを手動で一番下までスクロールするように指示できます。何かのようなもの:

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1);
        }
    });
}

@Bhupendraは必要ありません。Wartingの回答に示されているように、スレッドなしでも実行できます。
sagarpatidar 2014

2
@Bhupendra setSelection()はUIを更新します。ビューでpost(Runnable)を呼び出すことにより、Android UIスレッドでRunnableコードが実行されることを確認します。既にUIスレッドを使用していることがわかっている場合、または他の方法で確認している場合を除き、通常はこの方法で行います。
メイソン・リー

5
また、新しく設定されたアダプターでポストを使用すると、メインスレッドにあることを確認しながらスクロールアニメーションが発生し、アダプターを設定した直後にsetSelectionを使用すると、スクロールアニメーションが発生しないようです
Gianluca P.

1
@SaifHamedは、ケビンの答えについてメイソンリーがコメントしているため、短いリストでは、ビューの上部ではなく、目的の動作ではない可能性が高い「空の」スペースが発生します。
dashhund 2015年

16
myListView.smoothScrollToPosition(myListAdapter.getCount()-1);を使用することもできます。スムーズなスクロールのために
Zar E Ahmer

238

リストビューでこれらのパラメーターを使用する必要があります。

  • スクロール lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • リストの先頭を下に設定します lv.setStackFromBottom(true);

これらのパラメータをXMLで設定することもできます。このような:

<ListView
   ...
   android:transcriptMode="alwaysScroll"
   android:stackFromBottom="true" />

27
この方法では、行が追加されるときにビューの「下からスタック」されることに注意してください。これは、短いリストでは、ビューの下部ではなく上部に「空の」スペースができることを意味しますが、これは常に望んでいることではありません。
メイソン・リー

2
簡単な質問:スクロールをアニメーション化する方法はありますか?現在、notifyDataSetChanged()を実行すると、アニメーションなしでジャンプしますか?!?
Georg

@Georgデバイスの開発者向けオプションでアニメーションを無効にした可能性がありますか?
JonasCz-モニカを2015年

35

TRANSCRIPT_MODE_ALWAYS_SCROLLとsetSelectionの組み合わせにより、うまく機能しました

ChatAdapter adapter = new ChatAdapter(this);

ListView lv = (ListView) findViewById(R.id.chatList);
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv.setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});

29

私はボタンのクリックに応答してこれを使用して成功したので、コンテンツを更新した後にも使用できると思います。

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);

1
これは素晴らしいソリューションです。シンプルな1行。
Josh Larson

12

これをListFragmentで取得するには:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`

誰かがListFragmentで同じ問題をグーグル検索すると、彼はこれを見つけるだけなので、この回答を追加しました。

よろしく


9

使用:リストの先頭を下に設定します lv.setStackFromBottom(true);

私にとってはうまくいき、リストが最初に表示されたときにリストが自動的に一番下までスクロールされました。次に、リストはでスクロールされTRANSCRIPT_MODE_ALWAYS_SCROLLます。


6
この方法では、行が追加されるときにビューの「下からスタック」されることに注意してください。つまり、短いリストでは、ビューの下部ではなく上部に「空の」スペースができます。
メイソン・リー

5

私が使う

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

下部にエントリを追加し、チャットトランスクリプトのように古いエントリを上からスクロールします


getListView().smoothScrollToPosition(getListAdapter.getCount() - 1);onstartを呼び出して、アクティビティの開始時に一番下までスクロールします。
palindrom

4

最も簡単な解決策は次のとおりです。

    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setStackFromBottom(true);

3

文字起こしモードは必要なものであり、GoogleトークとSMS / MMSアプリケーションで使用されます。アイテムを追加するときに、アダプターでnotifyDatasetChanged()を正しく呼び出していますか?


はい、そうです。リストは正しく更新されますが、常に上から開始されます。新しいアイテムを追加し、常にリストの最後までスクロールするために必要です。
jramirez 2010

文字起こしモードは、実際にはSMSアプリによって無効になっています。その理由を正確に思い出せません。
Timmmm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.