2017-09-15 40 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'问题 –