2017-09-15 1 views
-1

ich ein mChildEventListener habe, die für die ersten n Artikel von Firebase Database und anderen mChildEventListener2 abfragt (ausgelöst, wenn der Benutzer blättern und klickt auf eine Load More Taste), die für die nächsten n-Abfragen Elemente und fügt sie zu ChatMessagesList hinzu.Listview scrollt nach dem Update auf der Ganzen

Wenn der Benutzer klickt auf die Schaltfläche Load More: die ChatMessagesList aktualisiert und notifyDataSetChanged aufgerufen. Die mMessageListView ist aktualisiert, aber es scrollt jedes Mal bis zum Ende. Ich erklärte dieses Verhalten wegen des xml-Attributs: android:transcriptMode="alwaysScroll".

Wenn ich entfernen transcriptMode="alwaysScroll" und drückt der Benutzer auf der Load More Taste, die mMessageListView Rollen diesmal nach oben.

Keiner dieser Verhaltensweisen wollten. Ich möchte, dass, wenn der Benutzer den Knopf drückt, würde die mMessageListView seine halten Scrolling Position. (aus offensichtlichen Gründen)

Ich versuchte notifyDataSetChanged von einem neuen Thread aufrufen. Keine Ergebnisse.

Ich versuchte mit listView.setSelectionFromTop(lastViewedPosition, topOffset); oder mit list.smoothScrollToPosition(); aber keiner erreicht eine glatte Erfahrung, die ich möchte.

Wie kann ich die Scroll-Position beibehalten, nachdem die mMessageListView aktualisiert wurde?

Dies ist der Code:

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); 
} 

Antwort

0
notifyDataSetChanged() 

Benachrichtigt die beigefügten Beobachter, dass die zugrunde liegenden Daten geändert wurde und jede Ansicht des Datensatzes zulässt, sollte sich erfrischen.

Versuchen Sie, wenn „onCreate()“ zu sehen, wieder aufgerufen, wenn für Sie

+0

zu verwenden Ich sehe die Relevanz nicht. Bitte erarbeiten –

0

FirebaseUI lib alles, Griffe und vereinfacht den Code zu aktualisieren. BTW, können Sie mAdapter.notifyItemInserted(ChatMessages.size() - 1); oder mMessageAdapter.notifyItemRangeInserted(ChatMessages.size() - 1, ChatMessages.size() - 1 + numberOfItemsBeingInserted); verwenden und die anderen erforderlichen Änderungen vornehmen, damit dies funktioniert, anstatt mMessageAdapter.notifyDataSetChanged();

+0

Sie meinen FirebaseUI lib Daten Paginierung behandelt? –

+0

Ja! Verwenden Sie einfach 'FirebaseIndexRecyclerAdapter (Klasse modelClass, @LayoutRes int modelLayout, Klasse viewHolderClass, Abfrage keyQuery, DatabaseReference dataRef)' Konstruktor statt 'FirebaseRecyclerAdapter ( Food.class, R.layout. card_view_food, FoodCardViewHolder.class, foodInfoRef) ' –

+0

Noch,' FirebaseIndexRecyclerAdapter' zu verwenden, würde mich erfordern, meine 'ChatMessages' zu indizieren, eine Sache, die ich vermieden habe. Ich habe meine Daten paginiert, ich habe nur ein Problem mit der 'ListView' –

Verwandte Themen