我有一個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);
}
我沒有看到相關性。請詳細說明 –