#android #android-recyclerview #android-adapter
#Android #android-recyclerview #android-адаптер
Вопрос:
Мне нужно добавить сообщение в мой recyclerview в Android. Но не удалось добавить в список после добавления notifyDataSetChaged().
Вот мой код
Используется адаптер и фрагмент.
Адаптер покажет сообщение получателя и отправителя слева и справа в соответствии с идентификатором пользователя. Идентификатор владельца привязки используется для отображения списка собственных пользовательских и других пользовательских сообщений слева и справа так же, как и у wapp.
Фрагмент чата:
public void onviewCreated() {
mSendMsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String msgContent = mSendMsgInputBox.getText().toString();
if(!TextUtils.isEmpty(msgContent))
{
execute(new PostMessageRequest( msgContent,getmId()), mPostMessageListener);
int i1 = msharedprefs.getInt(msgContent, 0);
i1 = 1;
SharedPreferences.Editor editor = msharedprefs.edit();
editor.putInt(msgContent, i1);
editor.commit();
int newMsgPosition = messagesList.size();
System.out.println("newMsgPosition ==" newMsgPosition);
// Notify recycler view insert one new data.
mAdapter.notifyItemInserted(newMsgPosition);
// Scroll RecyclerView to the last message.
//mChatMessageRecyclerView.scrollToPosition(0);
mSendMsgInputBox.setText("");
mAdapter.notifyDataSetChanged();
}
}
});
My Adapter:
private static final int VIEW_TYPE_MESSAGE_SENT = 1;
private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;
private List<MyMessageModel> msgDtoList;
MyMessageModel msgDto = this.msgDtoList.get(position);
@Override
public int getItemViewType(int position) {
MyMessageModel message = (MyMessageModel) msgDtoList.get(position);
if (message.getId().equals(Profile.getId())) {
// If the current user is the sender of the message
return VIEW_TYPE_MESSAGE_SENT;
} else {
// If some other user sent the message
return VIEW_TYPE_MESSAGE_RECEIVED;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == VIEW_TYPE_MESSAGE_SENT) {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.sender_message_layout, parent, false);
return new SenderMessageHolder(view);
} else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED) {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.receiver_message_layout, parent, false);
return new ReceiverMessageHolder(view);
}
return null;
}
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
LastMessageContent message = (LastMessageContent) msgDtoList.get(position);
switch (holder.getItemViewType()) {
case VIEW_TYPE_MESSAGE_SENT:
populateSentViewHolder(holder, position); break;
case VIEW_TYPE_MESSAGE_RECEIVED:
populateReceivedViewHolder(holder, position);
}
@SuppressLint("ResourceAsColor")
private void populateSentViewHolder(RecyclerView.ViewHolder holder, int position) {
MyMessageModal msgDto = this.msgDtoList.get(position);
((SenderMessageHolder) holder).rightMsgTextView.setText(msgDto.getmMSg());
}
@SuppressLint("ResourceAsColor")
private void populateReceivedViewHolder(RecyclerView.ViewHolder holder, int position) {
MyMessageModal msgDto = this.msgDtoList.get(position);
((ReceiverMessageHolder) holder).leftMsgTextView.setText(msgDto.getmMSg());
}
Комментарии:
1. Попробуйте добавить
mChatMessageRecyclerView.requestLayout();
afert.notifyItemInserted
, без.notifyDataSetChanged
2. Многие фрагменты кода отсутствуют, поэтому это сложно …… Однако вы уведомляете, используя «notifyItemInserted (newMsgPosition)», но прокрутка до position = 0, и если значение «newMsgPosition» достаточно велико, тогда этот новый элемент выходит за пределы первой страницы ListView, и представление не обновляется до прокрутки до»scrollToPosition (newMsgPosition)». Но это всего лишь предположение, потому что неясно, как вы добавляете и получаете элементы….
3. Вы когда-нибудь добавляли сообщение в
messageDtoList
? Похоже, вы звонитеnotifyDatasetChanged
, даже не меняя данные?4. Ну, у вас есть список в адаптере, который вы заполнили элементами, без добавления новых элементов вы никогда не получите никаких изменений? Оба подхода работают с вашими сообщениями R / L, реально я не думаю, что это будет иметь большое значение.
5. Объяснение этого, похоже, выходит за рамки этого вопроса, вы можете изучить, как сортировать список, там много документации!