'ChatApp Recycler is Lagging
Hello everyone I am Creating a ChatApp and in which i am getting message of Different type
- Text
- Image
- Audio
- Video I am checking that whether the message is of me or the other user in getItemViewType method of my recyler Adapter and than checking the message type in OnCreateViewholder and passing the particular Binding at runtime so that My App works smoothly but the problem is that The app is lagging when the I click on previous activity item to open my chat activity it takes its sweet time of 1 - 2 seconds and when i am in my Chat Activity the Screen Lags when i scroll the total amount of views which are used in recyler view are 10 5 for sending side and 5 for receiving side
Following is my MessageAdapter Which also contains Viewholder
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;
import com.example.chat.R;
import com.example.chat.callBacks.SentMessageCallback;
import com.example.chat.databinding.ItemMessageReceiveAudioBinding;
import com.example.chat.databinding.ItemMessageReceiveBinding;
import com.example.chat.databinding.ItemMessageReceiveFileBinding;
import com.example.chat.databinding.ItemMessageReceiveImageBinding;
import com.example.chat.databinding.ItemMessageReceiveVideoBinding;
import com.example.chat.databinding.ItemMessageSentAudioBinding;
import com.example.chat.databinding.ItemMessageSentBinding;
import com.example.chat.databinding.ItemMessageSentFileBinding;
import com.example.chat.databinding.ItemMessageSentImageBinding;
import com.example.chat.databinding.ItemMessageSentVideoBinding;
import com.example.chat.models.Message;
import java.util.ArrayList;
import java.util.List;
//************************************************************
public class MessageAdapter
extends RecyclerView.Adapter
//************************************************************
{
private static final int TYPE_MESSAGE_SENT = 0;
private static final int TYPE_MESSAGE_RECEIVED = 1;
private static final int TYPE_IMAGE_SENT = 2;
private static final int TYPE_IMAGE_RECEIVED = 3;
private static final int MSG_UPDATE_SEEK_BAR = 1845;
Context mContext;
private LayoutInflater inflater;
private List<Message> messageList = new ArrayList<>();
private SentMessageCallback callback;
boolean isNewMessage = false;
Message mMessage;
//************************************************************
public MessageAdapter(Context mContext, LayoutInflater inflater,
SentMessageCallback callback)
//************************************************************
{
this.inflater = inflater;
this.callback = callback;
this.mContext = mContext;
}
//************************************************************
@Override
public int getItemViewType(int position)
//************************************************************
{
mMessage = messageList.get(position);
if (mMessage.isMe()) {
return TYPE_MESSAGE_SENT;
} else {
return TYPE_MESSAGE_RECEIVED;
}
}
//************************************************************
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
int viewType)
//************************************************************
{
View view;
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case TYPE_MESSAGE_SENT:
// view = inflater.inflate(R.layout.item_message_sent, parent, false);
switch (mMessage.getType()) {
case "text":
return new SentMessageViewHolder(ItemMessageSentBinding.inflate(layoutInflater, parent, false), mMessage);
case "audio":
return new SentMessageViewHolder(ItemMessageSentAudioBinding.inflate(layoutInflater, parent, false), mMessage);
case "image":
return new SentMessageViewHolder(ItemMessageSentImageBinding.inflate(layoutInflater, parent, false), mMessage);
case "video":
return new SentMessageViewHolder(ItemMessageSentVideoBinding.inflate(layoutInflater, parent, false), mMessage);
case "file":
return new SentMessageViewHolder(ItemMessageSentFileBinding.inflate(layoutInflater, parent, false), mMessage);
}
break;
case TYPE_MESSAGE_RECEIVED:
// view = inflater.inflate(R.layout.item_message_receive, parent, false);
switch (mMessage.getType()) {
case "text":
return new ReceivedMessageHolder(ItemMessageReceiveBinding.inflate(layoutInflater, parent, false), mMessage);
case "audio":
return new ReceivedMessageHolder(ItemMessageReceiveAudioBinding.inflate(layoutInflater, parent, false), mMessage);
case "image":
return new ReceivedMessageHolder(ItemMessageReceiveImageBinding.inflate(layoutInflater, parent, false), mMessage);
case "video":
return new ReceivedMessageHolder(ItemMessageReceiveVideoBinding.inflate(layoutInflater, parent, false), mMessage);
case "file":
return new ReceivedMessageHolder(ItemMessageReceiveFileBinding.inflate(layoutInflater, parent, false), mMessage);
}
break;
}
return null;
}
//************************************************************
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder,
int position)
//************************************************************
{
Message message = messageList.get(position);
holder.setIsRecyclable(false);
if (message.isMe()) {
SentMessageViewHolder messageViewHolder = (SentMessageViewHolder) holder;
messageViewHolder.setData(mContext, message, messageViewHolder, position, callback);
} else {
ReceivedMessageHolder messageHolder = (ReceivedMessageHolder) holder;
messageHolder.setData(mContext, message, messageHolder, position, callback);
}
}
//************************************************************
@Override
public int getItemCount()
//************************************************************
{
return messageList.size();
}
//************************************************************
public void addAllMessages(List<Message> messageList)
//************************************************************
{
this.messageList.addAll(messageList);
notifyDataSetChanged();
}
//************************************************************
public void addNewMessage(Message message, boolean isNewMessage)
//************************************************************
{
messageList.add((message));
this.isNewMessage = isNewMessage;
notifyDataSetChanged();
}
//************************************************************
public void setMargins(View v, int l, int t, int r, int b)
//************************************************************
{
if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
p.setMargins(l, t, r, b);
v.requestLayout();
}
}
//************************************************************
//************************************************************
public static class SentMessageViewHolder
extends RecyclerView.ViewHolder
//************************************************************
//************************************************************
{
TextView messageTxt, textTime;
ImageView text_sendTick;
RelativeLayout textMessageLayout;
ConstraintLayout messageOutGoingLayout;
public View parent;
//************************************************************
public SentMessageViewHolder(@NonNull ItemMessageSentBinding mSentText, Message message)
//************************************************************
{
super(mSentText.getRoot());
parent = itemView;
}
//************************************************************
public SentMessageViewHolder(@NonNull ItemMessageSentAudioBinding mSentAudio, Message message)
//************************************************************
{
super(mSentAudio.getRoot());
parent = itemView;
}
//************************************************************
public SentMessageViewHolder(@NonNull ItemMessageSentImageBinding mSentImage, Message message)
//************************************************************
{
super(mSentImage.getRoot());
parent = itemView;
}
//************************************************************
public SentMessageViewHolder(@NonNull ItemMessageSentVideoBinding mSentVideo, Message message)
//************************************************************
{
super(mSentVideo.getRoot());
parent = itemView;
}
//************************************************************
public SentMessageViewHolder(@NonNull ItemMessageSentFileBinding mSentFile, Message message)
//************************************************************
{
super(mSentFile.getRoot());
parent = itemView;
}
//************************************************************
public void setData(Context context, Message item,
SentMessageViewHolder viewHolder, int itemPosition,
SentMessageCallback callback)
//************************************************************
{
// messageTxt.setText(item.getMessage());
parent.setOnClickListener(v ->
{
callback.onSentMessageClick(item, viewHolder, itemPosition);
});
parent.setOnLongClickListener(v ->
{
callback.onSentMessageLongClick(item, viewHolder, itemPosition);
return false;
});
}
}
//************************************************************
//************************************************************
public static class ReceivedMessageHolder
extends RecyclerView.ViewHolder
//************************************************************
//************************************************************
{
TextView messageTxt, textTime;
RelativeLayout textMessageLayout;
ConstraintLayout incomingMessageLayout;
public View parent;
//************************************************************
public ReceivedMessageHolder(@NonNull ItemMessageReceiveBinding mReceiveText, Message message)
//************************************************************
{
super(mReceiveText.getRoot());
parent = itemView;
}
//************************************************************
public ReceivedMessageHolder(@NonNull ItemMessageReceiveAudioBinding mReceiveAudio, Message message)
//************************************************************
{
super(mReceiveAudio.getRoot());
parent = itemView;
}
//************************************************************
public ReceivedMessageHolder(@NonNull ItemMessageReceiveImageBinding mReceiveImage, Message message)
//************************************************************
{
super(mReceiveImage.getRoot());
parent = itemView;
}
//************************************************************
public ReceivedMessageHolder(@NonNull ItemMessageReceiveVideoBinding mReceiveVideo, Message message)
//************************************************************
{
super(mReceiveVideo.getRoot());
parent = itemView;
}
//************************************************************
public ReceivedMessageHolder(@NonNull ItemMessageReceiveFileBinding mReceiveFile, Message message)
//************************************************************
{
super(mReceiveFile.getRoot());
parent = itemView;
}
//************************************************************
ReceivedMessageHolder(View itemView)
//************************************************************
{
super(itemView);
parent = itemView;
messageTxt = itemView.findViewById(R.id.receivedTxt);
textTime = itemView.findViewById(R.id.textview_time);
textMessageLayout = itemView.findViewById(R.id.textMessageLayout);
incomingMessageLayout = itemView.findViewById(R.id.incoming_layout_bubble);
}
//************************************************************
public void setData(Context context, Message item, ReceivedMessageHolder viewHolder,
int itemPosition, SentMessageCallback callback)
//************************************************************
{
// messageTxt.setText(item.getMessage());
parent.setOnClickListener(v -> {
callback.onReceivedMessageClick(item, viewHolder, itemPosition);
});
parent.setOnLongClickListener(v -> {
callback.onReceivedMessageLongClick(item, viewHolder, itemPosition);
return false;
});
}
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
