【问题标题】:Listview Scroll to the end of the list after updating the listListview 更新列表后滚动到列表末尾
【发布时间】:2011-04-06 02:41:51
【问题描述】:

在我使用 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 中定义此属性,如下面的帖子所示。

标签: android listview scroll


【解决方案1】:

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

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);平滑滚动
【解决方案2】:

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

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

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

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

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

【讨论】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 这是一个很好的解决方案。简单,一行。
    【解决方案5】:

    要在 ListFragment 中获取它:

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

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

    问候

    【讨论】:

      【解决方案6】:

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

      为我工作,列表在首次显示时会自动滚动到底部。然后列表会随着TRANSCRIPT_MODE_ALWAYS_SCROLL 滚动。

      【讨论】:

      • 请注意,使用这种方法,行在添加时会“从视图底部堆叠”。这意味着短列表将在视图顶部而不是底部有“空白”空间。
      【解决方案7】:

      我用

      setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
      

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

      【讨论】:

      • 在 onstart 中调用 getListView().smoothScrollToPosition(getListAdapter.getCount() - 1); 以在活动开始时滚动到底部。
      【解决方案8】:

      最简单的解决方案是:

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

        • 是的,我是。列表正确更新,但始终从顶部开始。我只需要它来添加新项目并始终滚动到列表的末尾。
        • 文字记录模式实际上已被短信应用禁用。具体原因我记不清了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 2023-01-30
        • 1970-01-01
        • 2020-07-01
        • 2021-04-29
        • 2013-10-30
        相关资源
        最近更新 更多