2017-09-15 39 views
-1

我有一個mChildEventListenerFirebase 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); 
} 

回答

0
notifyDataSetChanged() 

通知所連接的觀察員底層數據已經改變和任何查看反映數據集應刷新本身。

試試,看看「的onCreate()」再次被更新

+0

我沒有看到相關性。請詳細說明 –

0

FirebaseUI lib處理所有爲你和簡化了代碼時。 順便說一句,你可以使用mAdapter.notifyItemInserted(ChatMessages.size() - 1);mMessageAdapter.notifyItemRangeInserted(ChatMessages.size() - 1, ChatMessages.size() - 1 + numberOfItemsBeingInserted);,並做出其他所需的更改,以使其工作,而不是使用mMessageAdapter.notifyDataSetChanged();

+0

您的意思是FirebaseUI lib處理數據分頁? –

+0

是的!只要使用'FirebaseIndexRecyclerAdapter(類 modelClass, @LayoutRes詮釋modelLayout, 類 viewHolderClass, 查詢keyQuery, DatabaseReference dataRef)'構造,而不是'FirebaseRecyclerAdapter <食品,FoodCardViewHolder>( Food.class, R.layout。 card_view_food, FoodCardViewHolder.class, foodInfoRef)' –

+0

不過,使用'FirebaseIndexRecyclerAdapter'將需要我索引我的'ChatMessages',這是我所避免的。我管理分頁我的數據,我只是有'ListView'問題 –