我有一个mChildEventListener
从Firebase Database
查询的第一ñ项目和另一个mChildEventListener2
后顶部(触发时在Load More
按钮,用户向上滚动和点击),在未来ñ查询物品并将其添加到ChatMessagesList
。的ListView滚动到更新它
当用户点击按钮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);
}
我没有看到相关性。请详细说明 –