Listview在更新列表后滚动到列表的末尾

jra*_*rez 287 android listview scroll

我想,以确保列表中滚动一路底部,我以listAdapter更新列表视图后,使其显示在列表中输入的最后一个元素.我怎样才能做到这一点 ?

我试过这个但没有运气:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
Run Code Online (Sandbox Code Playgroud)

谢谢

Mas*_*Lee 412

假设您知道列表数据何时发生更改,您可以通过将列表选择设置为最后一行来手动指示列表滚动到底部.就像是:

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);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用myListView.smoothScrollToPosition(myListAdapter.getCount() - 1); 用于平滑滚动 (16认同)
  • 似乎在新设置的适配器上使用post会导致滚动动画,同时确保在主线程中并在设置适配器后立即使用setSelection导致无滚动动画 (5认同)
  • @Bhupendra setSelection()更新UI.通过在视图上调用post(Runnable),可以确保Runnable代码在android UI线程上运行.通常这样做,除非你知道你已经在UI线程上,或通过其他方式确保. (2认同)

dev*_*ini 235

您需要在列表视图中使用这些参数:

  • 滚动 lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • 将列表的头部设置为底部 lv.setStackFromBottom(true);

您也可以在XML中设置这些参数,例如.像这样:

<ListView
   ...
   android:transcriptMode="alwaysScroll"
   android:stackFromBottom="true" />
Run Code Online (Sandbox Code Playgroud)

  • 请注意,使用此方法,添加时,视图中的行"从底部堆叠".这意味着短列表将在视图顶部而不是底部具有"空"空间,这并不总是人们想要的. (25认同)
  • 快速提问:我可以通过任何方式让滚动动画化吗?因为当前我在notifyDataSetChanged()时跳转没有动画?!? (2认同)

Wär*_*ing 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);    
    }
});
Run Code Online (Sandbox Code Playgroud)


Ále*_*lex 28

我已经成功使用它来响应按钮点击,所以我猜你也可以在更新内容后使用它:

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);
Run Code Online (Sandbox Code Playgroud)


Kla*_*hen 12

要在ListFragment中获取此内容:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`
Run Code Online (Sandbox Code Playgroud)

添加了这个答案,因为如果有人在谷歌搜索与ListFragment相同的问题,他只是找到了这个..

问候


Kev*_*ker 9

使用:将列表的头部设置为底部 lv.setStackFromBottom(true);

为我工作,当列表首次进入可见性时,列表会自动滚动到底部.然后列表按原样滚动TRANSCRIPT_MODE_ALWAYS_SCROLL.

  • 请注意,使用此方法,添加时,视图中的行"从底部堆叠".这意味着短列表将在视图顶部而不是底部具有"空"空间. (5认同)

Plu*_*gie 5

我用

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
Run Code Online (Sandbox Code Playgroud)

在底部添加条目,较旧的条目从顶部滚动,就像聊天记录一样