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

}

Так что в основном все, что я пытаюсь сделать, это изменить статус доставки в указанном месте. Помогите мне решить эту проблему, это очень поможет мне, поэтому заранее спасибо. Если он тоже должен добавить какой-либо код, дайте мне знать.

Ответы (1)

Это заняло у меня много времени и большого разочарования, но, наконец, я смог решить эту проблему. Я звонил, пытаясь обновить адаптер по ошибке. Мне нужно было получить ссылку на объект, который я хотел обновить, от адаптера перед его изменением.

MessageCache cache = adapter.getItem(position);
cache.setRead(true);
adapter.notifyItemChanged(position);
adapter.notifyDataSetChanged();

2022 WebDevInsider