Android 更新列表后,Listview滚动至列表末尾

Android 更新列表后,Listview滚动至列表末尾,android,listview,scroll,Android,Listview,Scroll,我希望在使用listAdapter更新listview之后,确保列表一直滚动到底,以便它显示列表中输入的最后一个元素。我该怎么做 我试过了,但没有成功: lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 谢谢你抄本模式是你想要的,Google Talk和SMS/MMS应用程序使用它。添加项目时是否正确调用适配器上的notifyDatasetChanged()?您需要在列表视图中使用以下参数: 卷轴 lv.setTran

我希望在使用listAdapter更新listview之后,确保列表一直滚动到底,以便它显示列表中输入的最后一个元素。我该怎么做

我试过了,但没有成功:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

谢谢你

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

您需要在列表视图中使用以下参数:

  • 卷轴
    lv.setTranscriptMode(ListView.TRANSCRIPT\u MODE\u ALWAYS\u SCROLL)

  • 将列表的开头置于底部
    lv.setstackfromtombottom(真)

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

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

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


为我工作,列表在第一次显示时自动滚动到底部。然后,列表按其应有的方式滚动,使用
TRANSCRIPT\u MODE\u ALWAYS\u SCROLL

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

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

成绩单模式总是滚动和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);    
    }
});
我用


要在底部添加条目,并从顶部滚动较旧的条目,如聊天记录,我已经成功地使用它来响应按钮单击,因此我猜您也可以在更新内容后使用它:

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

要在ListFragment中获取此信息,请执行以下操作:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`
添加此答案是因为如果有人在谷歌上搜索ListFragment的相同问题,他会发现这一点


关于

最简单的解决方案是:

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

是的,我是。列表将正确更新,但始终从顶部开始。我只需要它来添加新项目,并始终滚动到列表的末尾。短信应用程序实际上禁用了成绩单模式。我记不清确切的原因了。请注意,使用这种方法,行在添加时会“从视图的底部堆叠”。这意味着短列表将在视图的顶部而不是底部有“空”空间。请注意,使用这种方法,行在添加时会“从底部堆叠”。这意味着短列表将在视图的顶部而不是底部有“空”空间,这并不总是人们想要的。快速提问:有没有办法让滚动动画化?因为当前当我notifyDataSetChanged()时,它会跳转而没有动画@Georg您是否在设备的开发者选项中禁用了动画?@Bhupendra这不是必需的。您也可以不使用线程,如瓦廷的回答所示。@Bhupendra setSelection()更新用户界面。通过在视图上调用post(Runnable),可以确保Runnable代码在android UI线程上运行。通常这样做,除非你知道你已经在UI线程上,在新设置的适配器上使用post会导致滚动动画,同时确保处于主线程中,并且在设置适配器后立即使用setSelection不会导致滚动animation@SaifHamed正如梅森·李对凯文的回答所评论的那样,这也导致短名单“空”视图顶部的空格而不是底部的空格,这很可能不是预期的行为。您也可以使用myListView.smoothScrollToPosition(myListAdapter.getCount()-1);为了实现平滑滚动,它可以工作…messagesListView.setTranscriptMode(ListView.TRANSCRIPT\u MODE\u NORMAL);messagesListView.setStackFromBottom(true);lv.setTranscriptMode(ListView.TRANSCRIPT\u MODE\u ALWAYS\u SCROLL)仅确保调用adapter.notifyDataSetChanged后将向下滚动ListView。如果这不起作用,请尝试用xml定义此属性,如下面的文章所示。调用
getListView().smoothScrollToPosition(getListAdapter.getCount()-1)可在活动开始时滚动到底部。这是一个很好的解决方案。简单,一行。
    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setStackFromBottom(true);