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);
}
zu verwenden Ich sehe die Relevanz nicht. Bitte erarbeiten –