【问题标题】:Android Firebase Database Adding items with keys to recycler viewAndroid Firebase 数据库将带有密钥的项目添加到回收站视图
【发布时间】:2017-08-28 08:28:36
【问题描述】:

我试图在回收器视图中动态添加和显示消息,但我不知道如何将正确的数据类型发送到它的适配器。在“getNewMessage(dataSnapshot)”函数中,我必须将所有消息添加到列表并通过适配器将其发送到回收器视图。我都试过了
MessageModel model = dataSnapshot.getValue(MessageModel.class)
并创建一个包含List<MessageModel> list 的 SampleModel,以及
SampleModel model = 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();
    }
}

我的 MessageModel 是:

public class MessageModel {
String id;
String author;
String content;
String date;

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public MessageModel(String id, String author, String content, String date) {
    this.id = id;
    this.author = author;
    this.content = content;
    this.date = date;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public String getContent() {
    return content;
}

public void setContent(String content) {
    this.content = content;
}

public MessageModel() {

}

}

还有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() + "'";
    }
}

很抱歉看到这么长的帖子,感谢您的宝贵时间。

【问题讨论】:

  • 你有错误代码吗?目前尚不清楚您要达到的目标。您没有指定此代码的结果关于正在发生的事情。请详细说明。你从哪里得到 getNewMessage
  • 我要问的是如何创建一个适配器我的意思是 adapter = new RecyclerAdapter(List> list) 填写问号。我已经写过这个问题:“我无法弄清楚如何将正确的数据类型发送到它的适配器”。由于 JSON 结构,发送 List 将不起作用。 getNewMessage() 也是我试图实现的目标。

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

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

在您的活动中列出清单。

ArrayList<MessageModel> myListModel = new ArrayList<MessageModel>();

在您的 Firebase 监听器上执行此操作。列出您的活动列表

这是给孩子添加的。

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

            MessageModel tempMessage = dataSnapshot.getValue(MessageModel.class);

            myListModel.add(tempRace);

        }

现在您有了一个列表模型。通过使用 Firebase 的 onChildAdeed。 使用它来提供您的适配器模型并应用它。

对 Firebase 很重要。在针对火力基地的每个查询中,如果您需要在完成其他任何操作后执行某项操作,例如:“onChildAdded”您需要在您的情况下向 THE SAME DatabaseReference 添加另一个侦听器。我不知道,你没有包括你的活动,甚至你的 DatabaseReference,所以我会提供一个。

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) {

        }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2016-10-03
    • 1970-01-01
    • 2015-11-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多