Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Firebase中仅下载部分数据库引用?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 在Firebase中仅下载部分数据库引用?

Java 在Firebase中仅下载部分数据库引用?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我有一个聊天应用程序作为Android应用程序的一部分,它将聊天室中的所有消息存储在Firebase数据库引用下,该数据库引用包含聊天室的ID号。目前,在聊天活动中保存消息的RecyclerView会在用户进入聊天室时下载该聊天室中的所有消息,这可能会消耗大量数据。如果用户滚动到顶部,我应该如何让它只下载X条最新消息,然后再下载X条 这是我的适配器: public class ChatRecyclerViewAdapter extends RecyclerView.Adapter<Chat

我有一个聊天应用程序作为Android应用程序的一部分,它将聊天室中的所有消息存储在Firebase数据库引用下,该数据库引用包含聊天室的ID号。目前,在聊天活动中保存消息的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);
}
}
公共类ChatRecycleServiceAdapter扩展了RecyclerView.Adapter{
私有静态最终字符串TAG=“chatRecycleServiceAdapter”;
私有字符串mRoomID;
私有上下文;
私有数据库引用mDatabaseReference;
私有ArrayList消息列表;
private ChildEventListener mListener=new ChildEventListener(){
@凌驾
公共void onChildaded(@NonNull DataSnapshot DataSnapshot,@null字符串s){
//将数据快照从数据库转换为消息对象
Message Message=dataSnapshot.getValue(Message.class);
//将其添加到消息的arrayList中
messageList.add(消息);
//注意变化
notifyItemInserted(messageList.size());
}
@凌驾
public void onChildChanged(@NonNull DataSnapshot DataSnapshot,@null字符串s){
}
@凌驾
公共void onChildRemoved(@NonNull DataSnapshot DataSnapshot){
}
@凌驾
public void onChildMoved(@NonNull DataSnapshot DataSnapshot,@null字符串s){
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
};
公共ChatRecycleServiceAdapter(上下文McContext、ArrayList mMessage、ArrayList Mautor、字符串mRoomID、数据库引用){
this.mContext=mContext;
this.mRoomID=mRoomID;
messageList=newarraylist();
mDatabaseReference=reference.child(mRoomID+“_消息”);
mDatabaseReference.addChildEventListener(mlListener);
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
//此方法加载ViewHolder的布局(字段)
View-View=LayoutInflater.from(parent.getContext()).flate(R.layout.chat\u msg\u行,parent,false);
ViewHolder=新的ViewHolder(视图);
报税表持有人;
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder,int位置){
//此方法使用每个列表项的数据填充字段
Log.d(标记“onBindViewHolder called”);
Message Message=messageList.get(位置);
holder.message.setText(message.getMessage());
holder.author.setText(message.getAuthor()+“:”);
}
@凌驾
public int getItemCount(){
返回messageList.size();
}
//Viewholder存储关于每个列表项的布局和内容的信息,并用作RecyclerView的每个项的模板
公共类ViewHolder扩展了RecyclerView.ViewHolder{
文本视图作者;
文本视图消息;
RelativeLayout singleMessageContainer;
公共视图持有者(视图项视图){
超级(项目视图);
author=itemView.findviewbyd(R.id.chatAuthor);
message=itemView.findviewbyd(R.id.chatMessage);
singleMessageContainer=itemView.findViewById(R.id.singleMessageContainer);
}
}
空洞清理(){
mDatabaseReference.removeEventListener(mListener);
}
}

如果消息已按时间顺序存储(例如,如果您使用
push()
添加消息),则可以按其键排序消息,并通过以下方式获取最新消息:

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

正如Doug所评论的,请查看更多选项

,您可能希望了解如何使用实时数据库进行查询。非常感谢你。我会的。