Reputation: 357
A trying to do a messaging app which I want to show double ticks if the other user has read the message. In my chat activity i have an interface that listens if a message is read.I want to change the image in the bubble from one tick to double ticks when the other user reads the message however all the methods I've tried doesn't work. Using:
adapter.notifyDataSetChanged();
adapter.notifyItemChanged(position);
Have tried deleting the item at that location and adding it again which works sometimes but mostly ends up duplicating the message.This is my adapter:
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<RecyclerView.ViewHolder> {
private final List<MessageCache> 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<MessageCache> 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;
}
}
}
So basically all am trying to do is change the delivery status at a specified location. Helping me solve this will help me a lot so thanks in advance. If he should add any code too please let me know.
Upvotes: 1
Views: 692
Reputation: 357
It took me a long time and a lot of frustration but finally was able to solve it.I was calling trying to update the adapter wrongly. Had to get a reference to the object i wanted to update from the adapter before changing it.
MessageCache cache = adapter.getItem(position);
cache.setRead(true);
adapter.notifyItemChanged(position);
adapter.notifyDataSetChanged();
Upvotes: 1