用于显示聊天列表:按请求值为 false 的子时间戳排序



我的Firebase实时数据库结构如下所示:

user id 1
user id 2
request: false
seen: true
timestamp: 1526021149790
user id 3
user id 4
request: true   
seen: false
timestamp: 1526021161002

现在我想按时间戳对回收器视图进行排序,其中只有请求值为 false 的项目。

目前,我可以按时间戳或请求值对它们进行排序,但不能同时执行这两项操作。我目前的代码是:
........................

Query conversationQueryByTimestamp = mConvDatabase.orderByChild("timestamp");
FirebaseRecyclerOptions<Conv> options =
new FirebaseRecyclerOptions.Builder<Conv>()
.setQuery(conversationQueryByTimestamp, Conv.class)
.build();
firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter<Conv, FirebaseUserDataViewHolder>(options) {
@Override
public FirebaseUserDataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.messageitem_layout, parent, false);
return new FirebaseUserDataViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull final FirebaseUserDataViewHolder holder, final int position, @NonNull final Conv model) {
Log.i("firesbaseCheck", "on bind view holder");
final String list_user_id = getRef(position).getKey();
Query lastMessageQuery = mMessageDatabase.child(list_user_id).limitToLast(1);
lastMessageQuery.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String data = dataSnapshot.child("message").getValue().toString();
String time = dataSnapshot.child("time").getValue().toString();
long lastTime = Long.parseLong(time);
holder.setMessage(data, model.isSeen());
holder.setTime(getTimeAgo(lastTime));
}
@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) {
}
});
mUsersDatabase.child(list_user_id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final String userName = dataSnapshot.child("name").getValue().toString();
String userImage = dataSnapshot.child("image").getValue().toString();
holder.setName(userName);
holder.setUserImage(userImage, getContext());
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

Intent chatIntent = new Intent(getContext(), MessageSingleActivity.class);
chatIntent.putExtra("user_id", list_user_id);
chatIntent.putExtra("type", "chat");
startActivity(chatIntent);
}
});

}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
};
rvChatList.setAdapter(firebaseRecyclerAdapter);
firebaseRecyclerAdapter.notifyDataSetChanged();

在Firebase 实时数据库中无法执行此操作。只能为单个子项提供筛选或排序。

如果您使用 Firebase Firestore,则可以实现此目的。它支持复合查询。

参考这个以了解消防库的优势。

其他解决方案:(效率不高(

获取请求值为"false"的数据,而不是根据时间戳获取排序的数据。这样它就不会返回所有用户。它只会返回您需要的用户列表。然后在代码中,根据时间戳对它们进行排序。

您必须维护另一个仅存储请求为 false 的用户的引用,以便您可以根据时间戳对它们进行排序。如果值更改为 true,请从引用中删除它们。您可以使用云功能来实现此目的。

最新更新