Вопросы по тегу: android-adapter

(1)

Обновить представление в определенном месте в представлении ресайклера

A пытается создать приложение для обмена сообщениями, в котором я хочу показать двойную галочку, если другой пользователь прочитал сообщение. В моем чате у меня есть интерфейс, который слушает, прочитано ли сообщение. Я хочу изменить изображение в пузыре с одного тика на двойное, когда другой пользователь читает сообщение, однако все методы, которые я пробовал, не работают . Использование:adapter.notifyDataSetChanged(); adapter.notifyItemChanged(position); Пытался удалить элемент в этом месте и добавить его снова, что иногда работает, но в большинстве случаев приводит к дублированию сообщения. Это мой адаптер:import android.app.Activity; import android.graphics.Typeface; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.apps.norris.mobidoc.R; import com.apps.norris.mobidoc.core.ChatService; import com.apps.norris.mobidoc.models.MessageCache; import com.apps.norris.mobidoc.utils.TimeUtils; import com.quickblox.chat.QBChatService; import com.quickblox.chat.QBPrivateChat; import com.quickblox.chat.QBPrivateChatManager; import com.quickblox.users.model.QBUser; import java.util.List; public class ChatAdapter extends RecyclerView.Adapter { private final List chatMessages; private Activity context; private final int ME=0; private final int OPPONENT=1; private Typeface robotoRegular; private QBPrivateChatManager privateChatManager; private QBPrivateChat privateChat; public ChatAdapter(Activity context, List chatMessages,int opponentID) { this.context = context; this.chatMessages = chatMessages; if(privateChatManager == null) privateChatManager = QBChatService.getInstance().getPrivateChatManager(); privateChat = privateChatManager.getChat(opponentID); } public MessageCache getItem(int position) { if (chatMessages != null) { return chatMessages.get(position); } else { return null; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder videwHolder; LayoutInflater inflater = LayoutInflater.from(parent.getContext()); robotoRegular = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Regular.ttf"); switch (viewType){ case OPPONENT: View v1 = inflater.inflate(R.layout.item_oppenent_chat_message,parent,false); videwHolder = new ViewHolder1(v1); break; default: View v2 = inflater.inflate(R.layout.item_my_chat_message,parent,false); videwHolder = new ViewHolder(v2); break; } return videwHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int viewType = holder.getItemViewType(); switch (viewType){ case OPPONENT:ViewHolder1 vh1 = (ViewHolder1) holder; configureViewHolder1(vh1,position); break; default:ViewHolder vh = (ViewHolder) holder; configureViewHolder(vh, position); break; } } private void configureViewHolder1(ViewHolder1 vh1, int position) { MessageCache chatMessage = getItem(position); vh1.getTxtInfo().setText(getTimeText(chatMessage)); vh1.getTxtMessage().setText(chatMessage.getMessage()); } private void configureViewHolder(ViewHolder vh, int position) { MessageCache chatMessage = getItem(position); vh.getTxtInfo().setText(getTimeText(chatMessage)); vh.getTxtMessage().setText(chatMessage.getMessage()); if (chatMessage.isRead()) { vh.getDelivery_status().setImageResource(R.drawable.ic_done_all_white_24dp); } else if (chatMessage.isDelivered()) { vh.getDelivery_status().setImageResource(R.drawable.ic_done_white_24dp); } else { vh.getDelivery_status().setImageResource(R.drawable.ic_query_builder_white_24dp); } } @Override public int getItemViewType(int position) { MessageCache chatMessage = getItem(position); QBUser currentUser = ChatService.getInstance().getCurrentUser(); boolean isOutgoing = chatMessage.getSenderId() == 0 || chatMessage.getSenderId()==currentUser.getId(); if (isOutgoing) return ME; else return OPPONENT; } @Override public long getItemId(int position) { return position; } @Override public int getItemCount() { if (chatMessages != null) { return chatMessages.size(); } else { return 0; } } public void add(MessageCache message) { chatMessages.add(message); } public void delete(int position){ chatMessages.remove(position); } private String getTimeText(MessageCache message) { return TimeUtils.convertLongToTime(message.getTime() * 1000); } public class ViewHolder extends RecyclerView.ViewHolder{ public TextView txtMessage; public TextView txtInfo; public ImageView delivery_status; public LinearLayout bubble_holder; public ViewHolder(View itemView) { super(itemView); txtMessage = (TextView) itemView.findViewById(R.id.txtMessage); txtInfo = (TextView) itemView.findViewById(R.id.txtInfo); delivery_status = (ImageView) itemView.findViewById(R.id.delivery_status); bubble_holder = (LinearLayout) itemView.findViewById(R.id.text_message_view); //set typefaces txtInfo.setTypeface(robotoRegular); } public TextView getTxtMessage() { return txtMessage; } public TextView getTxtInfo() { return txtInfo; } public ImageView getDelivery_status() { return delivery_status; } public LinearLayout getBubbleHolder() { return bubble_holder; } } public class ViewHolder1 extends RecyclerView.ViewHolder{ public TextView txtMessage; public TextView txtInfo; public LinearLayout bubble_holder; public ViewHolder1(View itemView) { super(itemView); txtMessage = (TextView) itemView.findViewById(R.id.txtMessage); txtInfo = (TextView) itemView.findViewById(R.id.txtInfo); bubble_holder = (LinearLayout) itemView.findViewById(R.id.text_message_view); } public TextView getTxtMessage() { return txtMessage; } public TextView getTxtInfo() { return txtInfo; } public LinearLayout getBubbleHolder() { return bubble_holder; } } }Так что в основном все, что я пытаюсь сделать, это изменить статус доставки в указанном месте. Помогите мне решить эту проблему, это очень поможет мне, поэтому заранее спасибо. Если он тоже должен добавить какой-либо код, дайте мне знать.
N

Norris Boateng

6 лет назад

Ответов: 1

2022 WebDevInsider