1

我有一个由评论填充的提要,我只是先加载最新的评论,当用户请求更多评论时,他们将被加载(从最新到最旧的评论)。

这就是我的数据库的样子:

节点

因此,假设我想一次只返回 1 条评论以开始...提要将从数据库列表中的最后一条评论开始,因为它是最近的评论,然后当用户请求它时,我想加载中间的评论但它必须放在我的recyclerView下面等等......

这是我的代码:

private void loadData(long lastDate) {
    Query query;

    if (lastDate == 0) {
        query = Util.mServerDatabaseRef.child(Util.getServer().getServerUID()).child("timeline").child("commentList").orderByChild("date").limitToLast(1);
    } else {
        query = Util.mServerDatabaseRef.child(Util.getServer().getServerUID()).child("timeline").child("commentList").orderByChild("date").endAt(lastDate).limitToFirst(1);
    }

    new Thread(() -> query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            commentList = new ArrayList<>();
            for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
                    commentList.add(userSnapshot.getValue(Comment.class));
                    adapter.notifyDataSetChanged();
            }
            mIsLoading = false;
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            mIsLoading = false;
        }
    })).start();
}

lastDate 是最后评论的日期是我的适配器列表;

第一次加载工作得很好,但我无法解决这个问题以从最新到最旧检索评论并将其放置在每次下方。它的方式将返回或相同的评论或最旧的评论,并将其放在列表的顶部。当然,我也需要它一次处理超过 1 条评论。任何帮助表示赞赏

4

1 回答 1

0

我会尽量给你这个想法,下面是未经测试的。但它应该在第一次加载时给你最后一条评论,然后每次加载更多时它应该给你一个一条的下一条评论:

尝试在最后一条评论之前保留评论时间的参考:

//have this as a member field to keep a reference of it

long dateBeforeLastComment = 0;

//have this also as member field (don't recreate this or you will be clearing it every time you load more comments

commentList = new ArrayList<>();

第一次加载时,加载最后一条评论并保留之前的时间参考:

private void loadData() {

query =Util.mServerDatabaseRef.child(Util.getServer().getServerUID()).child("timeline").child("commentList").orderByChild("date").limitToLast(2);


query.addListenerForSingleValueEvent(new ValueEventListener() {

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

int index = 0;

for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
index++;

if(index == 1){

//keep reference
dateBeforeLastComment = userSnapshot.child("date").getValue(Long.class);

}else{
//add to list
commentList.add(userSnapshot.getValue(Comment.class));
adapter.notifyDataSetChanged();
}

}

mIsLoading = false;

}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
mIsLoading = false;
}




}

现在,每次您想加载更多内容时,请尝试在前一个日期的参考处结束:

private void loadMoreData() {

if(dateBeforeLastComment != 0){

query =Util.mServerDatabaseRef.child(Util.getServer().getServerUID()).child("timeline").child("commentList").orderByChild("date").endAt(dateBeforeLastComment).limitToLast(2);


query.addListenerForSingleValueEvent(new ValueEventListener() {

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


int index = 0;

for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
index++;

if(index == 1){

//keep reference again
dateBeforeLastComment = userSnapshot.child("date").getValue(Long.class);

}else{

//add to list
commentList.add(userSnapshot.getValue(Comment.class));
adapter.notifyDataSetChanged();
}

}

mIsLoading = false;

}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
mIsLoading = false;
}


}

}
于 2020-05-12T16:47:13.287 回答