java - 显示无尽的先前对象 recyclerView

标签 java android google-cloud-firestore pagination

我有一个聊天应用程序,首先我显示最后 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/

相关文章:

java - 在 JNA 中使用 TCHAR 缓冲区

java - 如何成功升级位图?

javascript - Firestore简单排行榜功能

java - 在android中如何处理Runnable Handler类

java - 缓冲区读取器意外行为

javascript - 电话 : href "Click to call" link not working in Android

firebase - Flutter:从firebase检索数据

firebase - 无法将网址保存在Firestore中

java模式接受带空格的字符串

java - 阻止 Android Studio 使用支持库