java - FirebaseRecyclerAdapter 中的数据库查询
问题描述
代码:
FirebaseRecyclerOptions<MessagesHelper> options =
new FirebaseRecyclerOptions.Builder<MessagesHelper>()
.setQuery(mFetchingMessages, MessagesHelper.class)
.build();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<MessagesHelper, Chat.MessagesViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull final Chat.MessagesViewHolder holder, final int position, @NonNull final MessagesHelper model) {
holder.setMessage(model.getMessage());
final String userId = getRef(position).getKey();
final DatabaseReference mTimeReference = FirebaseDatabase.getInstance().getReference().child("Messages").child(MessageSenderId).child(MessageRecieverId);
Query messageQuery = mTimeReference.limitToLast(10);
messageQuery.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
final String from_user = model.getFrom();
final boolean Seen = model.isSeen();
MessagesHelper message = dataSnapshot.getValue(MessagesHelper.class);
itemPos++;
if(itemPos == 1){
String messageKey = dataSnapshot.getKey();
mLastKey = messageKey;
mPrevKey = messageKey;
}
if (from_user != null && from_user.equals(MessageSenderId)) {
holder.mDisplayMessage.setBackgroundColor(Color.BLUE);
holder.mDisplayMessage.setBackgroundColor(Color.WHITE);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.mDisplayMessage.getLayoutParams();
params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
holder.mDisplayMessage.setLayoutParams(params);
mTimeReference.keepSynced(true);
if (Seen == true) {
holder.mDisplayMessage.setBackgroundColor(Color.CYAN);
mTimeReference.keepSynced(true);
} else {
holder.mDisplayMessage.setBackgroundColor(Color.BLUE);
mTimeReference.keepSynced(true);
}
} else {
holder.mDisplayMessage.setBackgroundColor(Color.GREEN);
holder.mDisplayMessage.setTextColor(data);
mTimeReference.keepSynced(true);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.mDisplayMessage.getLayoutParams();
params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
holder.mDisplayMessage.setLayoutParams(params);
}
messagesList.add(message);
messageList.scrollToPosition(messagesList.size() - 1);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public Chat.MessagesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.custom_activity_chat, parent, false);
return new Chat.MessagesViewHolder(view);
}
};
messageList.setAdapter(firebaseRecyclerAdapter);
firebaseRecyclerAdapter.startListening();
它获取完整数据而不是仅获取 10 个数据,我不明白为什么。此外,我在任何地方都使用了keepSensed,因为每次我重新启动活动时,整个事情都会再次执行......就像
每次我重新启动活动时都会发生这种情况......所以我怎样才能让活动只重新加载 10 个最新的而不是整个数据
解决方案
那么我怎样才能让活动只重新加载 10 个最新的而不是整个数据呢?
您将收到所有消息,而不是仅收到 10 条消息,因为您向适配器传递了一个FirebaseRecyclerOptions
对象,该对象包含一个没有限制的查询。
DatabaseReference mFetchingMessages = FirebaseDatabase.getInstance().getReference()
.child("Messages")
.child(MessageSenderId)
.child(MessageRecieverId);
要解决这个问题,您只需要添加这样的.limitToLast(10)
调用:
DatabaseReference mFetchingMessages = FirebaseDatabase.getInstance().getReference()
.child("Messages")
.child(MessageSenderId)
.child(MessageRecieverId);
.limitToLast(10)
推荐阅读
- php - Nginx 未找到文件,但从 mysql 中选择信息
- python - 在 pandas 的不同图表上绘制绘图
- sql - MS SQL 服务器滞后
- kubernetes - 入口服务类型
- css - 旋转 180 度的元素最终位于其他元素之后
- c# - 以异步方式调用同步方法?
- cordova - Cordova 插件推送错误:未定义 PushNotification
- c# - 如何将用户数据附加到曲棍球应用程序崩溃日志(HockeySDK for Unity / Android)
- microservices - 创建名为“eurekaInstanceConfigBean”的 bean 时出错:当此工厂的单例处于销毁状态时,不允许创建单例 bean
- java - “org.json.JSONException:禁止的数值:NaN”