1

我试图在回收站视图中动态显示消息&,但我无法弄清楚如何将正确的数据类型发送到它的适配器。在“getNewMessage(dataSnapshot)”函数中,我必须添加所有消息以列出并通过适配器将其发送到回收站视图。我都尝试
MessageModel model = dataSnapshot.getValue(MessageModel.class)
并创建包含List<MessageModel> list一个SampleModel和
SampleModel model = dataSnapshot.getValue(SampleModel.class);
他们没有工作。在这里,与发送消息创建示例JSON文件:Android Firebase数据库使用密钥添加项目以回收视图

"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" 
} 

我用下面的代码是我从火力文档获悉添加新的消息。

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

} 

}

而且火力听众

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

对不起,阅读这么长的文章,并感谢您的时间。

+0

你有错误代码。目前尚不清楚你想要达到的目标。您没有在发生的事情上指定此代码的结果。请详细说明。你甚至在哪里得到getNewMessage – Aizen

+0

我在问什么是如何创建一个适配器我的意思是adapter = new RecyclerAdapter(列表列表)填充问号。我已经写过这样的问题:“我不知道如何发送正确的数据类型到它的适配器”。由于JSON结构,发送List 将不起作用。 getNewMessage()也是我试图实现的。 – Ali

回答

0

你不需要再使用你的toMap,因为你已经有了POJO,所以它会让你更加困惑。

在您的活动中创建一个列表。

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

做到这一点你的火力监听器。在您的活动上制作清单

这是用于添加的儿童。

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

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

      myListModel.add(tempRace); 

     } 

现在你有一个列表模型。通过使用Firebase的onChildAdeed。 使用它可以提供适配器型号并应用它。

重要的火灾。在firebase的每个查询中,如果你需要在做其他事情之后做一些事情,例如:“onChildAdded”你需要在你的案例中添加另一个监听器到同一个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) { 

     } 
    }); 
+1

现在工作谢谢 – Ali

相关问题