【问题标题】:Download only part of Database reference in Firebase?在 Firebase 中仅下载部分数据库参考?
【发布时间】:2018-09-10 01:00:19
【问题描述】:

我有一个聊天应用程序作为我的 Android 应用程序的一部分,它将所有消息存储在一个带有该聊天室 ID 号的 Firebase 数据库引用下的聊天室中。就目前而言,在聊天 Activity 中保存消息的 RecyclerView 会在用户进入时下载该房间中的所有消息,从而消耗大量数据。如果用户滚动到顶部,我应该如何让它只下载 X 条最新消息并下载 X 条?

这是我的适配器:

public class ChatRecyclerViewAdapter extends RecyclerView.Adapter<ChatRecyclerViewAdapter.ViewHolder> {

private static final String TAG = "ChatRecyclerViewAdapter";
private String mRoomID;
private Context mContext;
private DatabaseReference mDatabaseReference;
private ArrayList<Message> messageList;



private ChildEventListener mListener = new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        // Convert data snapshot from Database into a Message Object

        Message message = dataSnapshot.getValue(Message.class);


        // Add it to an arrayList of Messages
        messageList.add(message);

        // Notice Changes
        notifyItemInserted(messageList.size());

    }

    @Override
    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    }

    @Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
    }
    @Override
    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
};

public ChatRecyclerViewAdapter(Context mContext, ArrayList<String> mMessage, ArrayList<String> mAuthor, String mRoomID, DatabaseReference reference) {

    this.mContext = mContext;
    this.mRoomID = mRoomID;
    messageList = new ArrayList<>();
    mDatabaseReference = reference.child(mRoomID+"_messages");
    mDatabaseReference.addChildEventListener(mListener);

}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    //This method loads layout(fields) of ViewHolder

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_msg_row,parent, false);
    ViewHolder holder = new ViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

    // This method fills fields with data for each list item

    Log.d(TAG,"onBindViewHolder called");

    Message message = messageList.get(position);

    holder.message.setText(message.getMessage());
    holder.author.setText(message.getAuthor()+":");


}

@Override
public int getItemCount() {
    return messageList.size();
}

//Viewholder stores the information about the layout and content of each list item, and serves as a template for each item of a RecyclerView


public class ViewHolder extends RecyclerView.ViewHolder {

    TextView author;
    TextView message;
    RelativeLayout singleMessageContainer;

    public ViewHolder(View itemView) {
        super(itemView);

        author = itemView.findViewById(R.id.chatAuthor);
        message = itemView.findViewById(R.id.chatMessage);
        singleMessageContainer = itemView.findViewById(R.id.singleMessageContainer);

    }
}

void cleanup() {

    mDatabaseReference.removeEventListener(mListener);
}
}

【问题讨论】:

标签: java android firebase firebase-realtime-database


【解决方案1】:

如果消息已经按时间顺序存储(例如,如果您使用push() 添加它们),您可以通过它们的键对消息进行排序并获取最新消息:

mDatabaseReference = reference.child(mRoomID+"_messages");
Query recentMessages = mDatabaseReference.orderByKey().limitToLast(10);
recentMessages.addChildEventListener(mListener);

正如 Doug 所说,请查看Firebase documentation on queries 了解更多选项

【讨论】:

  • 非常感谢。会做的。
猜你喜欢
  • 1970-01-01
  • 2017-12-11
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多