ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我试过这个但没有运气:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

谢谢你

尝试这样做它有效...messagesListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); messagesListView.setStackFromBottom(true);
lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL) 只保证调用adapter.notifyDataSetChanged后listView会向下滚动。如果这不起作用,请尝试在 xml 中定义此属性,如下面的帖子所示。

s
sulai

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

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 的回答所示。
@Bhupendra setSelection() 更新 UI。通过在视图上调用 post(Runnable),可以确保 Runnable 代码在 android UI 线程上运行。通常这样做,除非您知道您已经在 UI 线程上,或者正在通过其他方式确保这一点。
似乎在新设置的适配器上使用 post 会导致滚动动画,同时确保在主线程中,并且在设置适配器后立即使用 setSelection 不会导致滚动动画
@SaifHamed 正如 Mason Lee 对 Kevin 的回答所评论的那样,这也导致短列表在视图顶部而不是底部有“空白”空间,这很可能不是预期的行为。
你也可以使用 myListView.smoothScrollToPosition(myListAdapter.getCount()-1);平滑滚动
J
Jonas Czech

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

滚动 lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

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

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

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

请注意,使用这种方法,行在添加时会“从底部堆叠”视图。这意味着短列表将在视图顶部而不是底部有“空白”空间,这并不总是人们想要的。
快速提问:有什么方法可以让滚动动画?因为目前当我 notifyDataSetChanged() 它没有动画就跳转?!?
@Georg您是否在设备上的开发人员选项中禁用了动画?
W
Wärting

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);    
    }
});

M
Mason Lee

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

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

这是一个很好的解决方案。很简单,一行。
K
Klatschen

要在 ListFragment 中获取此信息:

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

添加了这个答案,因为如果有人用谷歌搜索 ListFragment 的相同问题,他只会发现这个..

问候


P
Pratik Butani

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

为我工作,当它第一次出现时,列表会自动滚动到底部。然后列表会随着 TRANSCRIPT_MODE_ALWAYS_SCROLL 滚动。


请注意,使用这种方法,行在添加时会“从底部堆叠”视图。这意味着短列表将在视图顶部而不是底部具有“空白”空间。
P
Plugie

我用

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

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


在 onstart 中调用 getListView().smoothScrollToPosition(getListAdapter.getCount() - 1); 以在活动开始时滚动到底部。
u
ucMedia

最简单的解决方案是:

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

R
Romain Guy

转录模式是您想要的,由 Google Talk 和 SMS/MMS 应用程序使用。添加项目时,您是否正确调用适配器上的 notifyDatasetChanged()?


我是。列表正确更新,但始终从顶部开始。我只需要它来添加新项目并始终滚动到列表的末尾。
短信应用程序实际上禁用了转录模式。我不记得究竟是为什么。