Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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
Android Firebase数据库将带有密钥的项目添加到回收器视图_Android_Firebase_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

Android Firebase数据库将带有密钥的项目添加到回收器视图

Android Firebase数据库将带有密钥的项目添加到回收器视图,android,firebase,firebase-realtime-database,android-recyclerview,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我试图在recycler视图中动态添加和显示消息,但我不知道如何将正确的数据类型发送到它的适配器。在“getNewMessage(dataSnapshot)”函数中,我必须将所有消息添加到列表中,并通过适配器将其发送到recycler视图。我两个都试过了 MessageModel=dataSnapshot.getValue(MessageModel.class) 以及创建一个包含列表的样本模型,以及 SampleModel=dataSnapshot.getValue(SampleModel.cl

我试图在recycler视图中动态添加和显示消息,但我不知道如何将正确的数据类型发送到它的适配器。在“getNewMessage(dataSnapshot)”函数中,我必须将所有消息添加到列表中,并通过适配器将其发送到recycler视图。我两个都试过了
MessageModel=dataSnapshot.getValue(MessageModel.class)

以及创建一个包含
列表
的样本模型,以及
SampleModel=dataSnapshot.getValue(SampleModel.class)
他们没有工作。下面是通过发送消息创建的JSON文件示例:

"chat" : {
"-Ksbjn0yCEB6EXhNNCM5" : {
  "author" : "Ali Alacan",
  "content" : "dummy content",
  "date" : "Mon Aug 28 10:29:50 GMT+03:00 2017",
  "id" : "H6huNPUggjtugjsERPCRSAp1"
},
"-KsbjpUtjp0oeipjjxMI" : {
  "author" : "Ali Alacan",
  "content" : "dummy content",
  "date" : "Mon Aug 28 10:30:00 GMT+03:00 2017",
  "id" : "H6huNPUggjtugjsERPCRSAp1"
}
我正在添加新的消息,下面是我从firebase文档中学到的代码

 @Exclude
public Map<String, Object> toMap(MessageModel messageModel) {
    HashMap<String, Object> result = new HashMap<>();
    result.put("id", messageModel.getId());
    result.put("author", messageModel.getAuthor());
    result.put("content", messageModel.getContent());
    result.put("date", messageModel.getDate());
    return result;
}

private void sendMessage() {
    if (!TextUtils.isEmpty(etMessage.getText())) {
        Date currentTime = Calendar.getInstance().getTime();
        String key = firebaseDatabase.push().getKey();
        MessageModel message = new MessageModel(UserData.getInstance().getUserId(), UserData.getInstance().getName(), "dummy content", currentTime.toString());
        Map<String, Object> messageValues = toMap(message);
        Map<String, Object> childUpdates = new HashMap<>();
        childUpdates.put("/chat/" + key, messageValues);
        childUpdates.put("/user-chat/" + UserData.getInstance().getUserId() + "/" + key, messageValues);
        firebaseDatabase.updateChildren(childUpdates);

    } else {
        Snackbar snackbar = Snackbar
                .make(getActivity().findViewById(R.id.dashboard_container), "Enter a message please ! " + UserData.getInstance().getName(), Snackbar.LENGTH_LONG);
        snackbar.show();
    }
}
}

和firebase侦听器

 firebaseDatabase.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            getNewMessage(dataSnapshot);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            //   getNewMessage(dataSnapshot);
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            // taskDeletion(dataSnapshot);
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
RecyclerView适配器:

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

private final List<MessageModel> mValues;
private final OnListFragmentInteractionListener mListener;

public MyMessageRecyclerViewAdapter(List<MessageModel> items, OnListFragmentInteractionListener listener) {
    mValues = items;
    mListener = listener;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_chat, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    holder.mItem = mValues.get(position);
    holder.mIdView.setText(mValues.get(position).getId());
    holder.mContentView.setText(mValues.get(position).getContent());
    holder.mAuthor.setText(mValues.get(position).getAuthor());
    holder.mDate.setText(mValues.get(position).getDate());
    holder.mView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (null != mListener) {
                // Notify the active callbacks interface (the activity, if the
                // fragment is attached to one) that an item has been selected.
                mListener.onListFragmentInteraction(holder.mItem);
            }
        }
    });
}

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

public class ViewHolder extends RecyclerView.ViewHolder {
    public final View mView;
    public final TextView mIdView;
    public final TextView mContentView;
    TextView mAuthor;
    TextView mDate;
    public MessageModel mItem;

    public ViewHolder(View view) {
        super(view);
        mView = view;
        mIdView = (TextView) view.findViewById(R.id.id);
        mContentView = (TextView) view.findViewById(R.id.content);
        mAuthor = (TextView) view.findViewById(R.id.author);
        mDate = (TextView) view.findViewById(R.id.date);

    }

    @Override
    public String toString() {
        return super.toString() + " '" + mContentView.getText() + "'";
    }
}
公共类MyMessageRecycleServiceAdapter扩展了RecyclerView.Adapter{ 私人最终清单价值; 私有final OnListFragmentInteractionListener MLListener; 公共MyMessageRecycleServiceAdapter(列表项,OnListFragmentInteractionListener){ M值=项目; mListener=监听器; } @凌驾 public ViewHolder onCreateViewHolder(视图组父级,int-viewType){ View=LayoutInflater.from(parent.getContext()) .充气(R.layout.item_chat,parent,false); 返回新的ViewHolder(视图); } @凌驾 公共无效onBindViewHolder(最终ViewHolder,内部位置){ holder.mItem=mValues.get(位置); holder.mIdView.setText(mValues.get(position.getId()); holder.mContentView.setText(mValues.get(position.getContent()); holder.mautor.setText(mValues.get(position.getAuthor()); holder.mDate.setText(mValues.get(position.getDate()); holder.mView.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ if(null!=mListener){ //通知活动回调接口(活动,如果 //片段被附加到一个)上,表示已选择项目。 mListener.onListFragmentInteraction(holder.mItem); } } }); } @凌驾 public int getItemCount(){ 返回mValues.size(); } 公共类ViewHolder扩展了RecyclerView.ViewHolder{ 公共最终视图mView; 公共最终文本视图中视图; 公共最终文本视图mContentView; 文本视图毛索尔; 文本视图mDate; 公共信息模型; 公共视图持有者(视图){ 超级(视图); mView=视图; mIdView=(TextView)view.findViewById(R.id.id); mContentView=(TextView)view.findViewById(R.id.content); Mautor=(TextView)view.findViewById(R.id.author); mDate=(TextView)view.findViewById(R.id.date); } @凌驾 公共字符串toString(){ 返回super.toString(); } }

很抱歉阅读了这么长的帖子,感谢您抽出时间。

您不需要再使用toMap了,因为您已经有了POJO,这会让您对正在做的事情更加困惑

在你的活动中列一个清单

ArrayList<MessageModel> myListModel = new ArrayList<MessageModel>();
现在您有了一个列表模型。通过使用Firebase提供的OnChildaFeed。 使用此选项提供适配器型号并应用它

对FIREBASE很重要。在fire base的每个查询中,如果您需要在完成其他任何操作后执行某些操作,例如:“OnChildaded”,则需要在您的案例中向同一数据库引用添加另一个侦听器。我不知道,您没有包括您的活动,甚至您的数据库引用,因此我将提供一个

DatabaseReference myReference = firebaseDatabase.getReferane("chat");
myReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            MyMessageRecyclerAdapter myMessageAdapter= new MyMessageRecyclerAdapter(myListModel, listener);

//now you have to apply this to the RecyclerView.
   yourWhateverNameofTheRecyclerview.SetAdapter(myMessageAdater);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

你不需要再使用你的toMap了,因为你已经有了一个POJO,这会让你更加困惑你在做什么

在你的活动中列一个清单

ArrayList<MessageModel> myListModel = new ArrayList<MessageModel>();
现在您有了一个列表模型。通过使用Firebase提供的OnChildaFeed。 使用此选项提供适配器型号并应用它

对FIREBASE很重要。在fire base的每个查询中,如果您需要在完成其他任何操作后执行某些操作,例如:“OnChildaded”,则需要在您的案例中向同一数据库引用添加另一个侦听器。我不知道,您没有包括您的活动,甚至您的数据库引用,因此我将提供一个

DatabaseReference myReference = firebaseDatabase.getReferane("chat");
myReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            MyMessageRecyclerAdapter myMessageAdapter= new MyMessageRecyclerAdapter(myListModel, listener);

//now you have to apply this to the RecyclerView.
   yourWhateverNameofTheRecyclerview.SetAdapter(myMessageAdater);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

您是否有错误代码。不清楚您试图实现的目标。您没有指定此代码的结果。请详细说明。您甚至从何处获得GetNewMessage我想问的是如何创建适配器我的意思是adapter=new RecyclerAdapter(列表)填写问号。我已经在问题中写道:“我不知道如何将正确的数据类型发送到它的适配器”。由于JSON结构,发送列表无法工作。还有getNewMessage()是我尝试实现的。您是否有错误代码。不清楚您尝试实现的是什么。您没有指定此代码的结果。请详细说明。您从哪里获得GetNewMessage?我问的是如何创建适配器我是说adapter=new RecyclerAdapter(列表)填上问号。我已经在问题中写道:“我不知道如何将正确的数据类型发送到它的适配器”。由于JSON结构,发送列表无法工作。getNewMessage()也是我尝试实现的目标。