我有一个聊天应用程序,首先我显示最后 50 条消息,然后如果用户向上滚动,它会加载前 50 条消息。
但是,出于某种原因,我就像被困在 1 个滚动条的限制上。我的意思是,例如,如果我的聊天中有 102 条消息,当我初始化聊天时,它会显示消息 62-102。
然后,如果用户向上滚动,它会向他显示消息 12-62。
然后,如果用户向上滚动它仍然停留在 12-62。
我使用的代码是:
public void getChats(String chatID, Boolean loadFlag , EventListener<QuerySnapshot> listener) {
Query lastMessages = db.collection("Chats")
.orderBy("SentTime", Query.Direction.ASCENDING).limitToLast( 50 );
if (loadFlag == false) {
lastMessages.addSnapshotListener( listener );
}
if (loadFlag == true) {
lastMessages.get()
.addOnSuccessListener( new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot documentSnapshots) {
DocumentSnapshot lastVisible = documentSnapshots.getDocuments().get( 0 );
Query previousMessages = db.collection( "Chats" )
.orderBy( "SentTime", Query.Direction.ASCENDING )
.endAt( lastVisible )
.limit( 50 );
previousMessages.addSnapshotListener( listener );
}
} );
}
}
loadFlag
是我使用的一些参数,以确保监听器仅在正确的位置。据我了解,这是因为我一直使用
limitToLast(50)
总是相同的 50,但我怎样才能在那里设置新的最后一个对象的值?我使用的软件包是:
import android.util.Log;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;
import java.util.HashMap;
import java.util.Map;
在我的情况下,我有什么理由不能进一步到 1-12 吗?
谢谢
最佳答案
据我了解limitToLast(50)
总是取最后 50 条消息。
但可能有适合您的用例的解决方案:根据文档,有一个名为 offset(int n)
的方法这将忽略前 n 个结果。您只需将跳过消息的数量存储在一个变量中。
像这样更改您的代码,然后重试:
int x = //TODO for each user request of old messages increment x and store it somewhere
Query lastMessages = db.collection("Chats")
.orderBy("SentTime", Query.Direction.ASCENDING).offset(x*50).limit(50);
也请改变这个
if (loadFlag == false) {
...
}
if (loadFlag == true) {
...
}
到这段代码:
if (loadFlag) {
//TODO CAREFUL, here loadFlag is TRUE
...
} else {
//TODO CAREFUL, here loadFlag is FALSE
}
关于java - 显示无尽的先前对象 recyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61705041/