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

相關問題