我正在构建一个聊天室应用程序,每隔X秒轮询一次新事件。每次发生这种情况时,此代码都会使用新数据更新RoomAdapter(ArrayAdapter的自定义子类)并将其滚动到底部:
RoomAdapter adapter = (RoomAdapter) getListAdapter();
for (int i=0; i<newEvents.size(); i++)
adapter.add(newEvents.get(i));
getListView().setSelection(events.size()-1);
这很好,但是如果用户向上滚动以查看房间的历史记录,那么当轮询发生时,它会将她跳到底部。我想要做的是,如果用户已经在列表的底部,那么在对新事件进行轮询之后,它就会停留在那里。如果用户有意向上滚动,我希望用户不要被打扰。
如何检测我何时已滚动到ListView的底部?
注意:我不能做getListView()。getSelectedItemPosition(),因为as the docs note,在触摸模式下调用setSelection实际上并没有选择项目,只是滚动到它。
答案 0 :(得分:6)
我没试过这个,但getLastVisiblePosition()==getCount()-1
怎么样? (ListView
上的方法)
答案 1 :(得分:5)
但这不是一个正确的方法。
使用
•android:transcriptMode
- 内容更改时列表的行为
- “禁用”,不滚动
- “正常”,如果最后一项可见,则滚动到底部
- “alwaysScroll”,始终滚动到底部
•android:stackFromBottom
- 按相反顺序堆叠项目
- 从适配器的最后一项开始
•对聊天有用
- 消息,谈话,IRC等。