【发布时间】:2018-02-24 16:35:32
【问题描述】:
我有一个 mChildEventListener 查询来自 Firebase Database 的前 n 个项目和另一个 mChildEventListener2(当用户向上滚动并单击 Load More 按钮时触发)查询对于接下来的 n 项,并将它们添加到 ChatMessagesList。
当用户单击Load More 按钮时:ChatMessagesList 被更新,notifyDataSetChanged 被调用。 mMessageListView 已更新,但每次都会向下滚动到底部。由于 xml 属性,我解释了这种行为:android:transcriptMode="alwaysScroll"。
当我删除transcriptMode="alwaysScroll" 并且用户按下Load More 按钮时,mMessageListView 这次滚动到顶部。
这些行为都不是我们想要的。我希望当用户按下按钮时,mMessageListView 将保持其滚动位置。 (原因很明显)
我尝试从新线程调用notifyDataSetChanged。没有结果。
我尝试使用listView.setSelectionFromTop(lastViewedPosition, topOffset); 或list.smoothScrollToPosition();,但都没有达到我想要的流畅体验。
mMessageListView更新后如何保持滚动位置?
这是代码:
private ChildEventListener mChildEventListener;
private ChildEventListener mChildEventListener2;
List<ChatMessage> ChatMessages = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mMessageAdapter = new MessageAdapter(this, R.layout.item_message_sent, ChatMessages);
mMessageListView.setAdapter(mMessageAdapter);
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if(i == 0) {
current_last_key = dataSnapshot.getKey();
}
else {
ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class);
mMessageAdapter.add(chatMessage);
}
i++;
}
...
};
Query messagesQuery = mDatabaseReference.child("chat_messages").
child(chatId).limitToLast(25);
messagesQuery.addChildEventListener(mChildEventListener);
...
}
@Override
public void onClick(View v) {
j = 0;
mChildEventListener2 = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if(!dataSnapshot.getKey().equals(current_last_key)) {
if (j == 0) {
current_last_key = dataSnapshot.getKey();
}
else {
ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class);
ChatMessages.add(j- 1, chatMessage);
}
}
else
{
ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class);
ChatMessages.add(0 , chatMessage);
loadMoreTextView.setVisibility(View.GONE);
}
mMessageAdapter.notifyDataSetChanged();
j++;
}
... };
Query query = mDatabaseReference.child("chat_messages").
child(chatId).orderByKey().endAt(current_last_key).limitToLast(10);
query.addChildEventListener(mChildEventListener2);
}
【问题讨论】:
标签: android listview scroll autoscroll