帮助聊天适配器。
Apadter 现在看起来像这样:
public class MSGAdapter extends RecyclerView.Adapter<MSGAdapter.MSGViewHolder> {
ArrayList<MessageModel> messages;
public MSGAdapter(ArrayList<MessageModel> messages) {
this.messages = messages;
}
@Override
public MSGViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_card_layout, parent, false);
MSGAdapter.MSGViewHolder nh = new MSGAdapter.MSGViewHolder(v);
return nh;
}
@Override
public void onBindViewHolder(MSGViewHolder holder, int position) {
Context ctx = holder.itemView.getContext();
LinearLayout.LayoutParams lparamsFile = new LinearLayout.LayoutParams(150, 150);
holder.message_.setText(messages.get(position).getContent().toString()); // Добавление текста сообщения
if(messages.get(position).getFile() != null) {
for (int i = 0; i < messages.get(position).getFile().size(); i++) {
ImageView file = new ImageView(ctx);//Изображение вложения
file.setScaleType(ImageView.ScaleType.CENTER_CROP);
file.setLayoutParams(lparamsFile);
switch (messages.get(position).getFile().get(i).getType().toString()) {
case "img":
Glide.with(ctx).load(messages.get(position).getFile().get(i).getSrc()).into(file);
break;
case "doc":
file.setImageDrawable(ctx.getResources().getDrawable(R.drawable.doc));
break;
case "audio":
file.setImageDrawable(ctx.getResources().getDrawable(R.drawable.audio));
break;
case "video":
file.setImageDrawable(ctx.getResources().getDrawable(R.drawable.video));
break;
}
holder.fileLayout.addView(file);
}
}
}
@Override
public int getItemCount() {
return messages.size();
}
public static class MSGViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
CardView cv;
LinearLayout mainLayout, messageLayout, fileLayout;
TextView message_;
public MSGViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.msg_card);
mainLayout = (LinearLayout) itemView.findViewById(R.id.main_layout);
messageLayout = (LinearLayout) itemView.findViewById(R.id.message_layout);
fileLayout = (LinearLayout) itemView.findViewById(R.id.file_layout);
message_ = (TextView) itemView.findViewById(R.id.message);
}
@Override
public void onClick(View view) {
}
}
消息(和附件)正常显示,只有在滚动消息列表时,附件才会“混乱”。
我已经明白这是因为我在 中声明了消息附件 ( ImageView ) OnBindViewHolder,如果我事先不知道消息中会有多少附件,我如何将它“传输”到 OnCreateViewHolder 阶段?messages.get(position).getFile()我需要在发送消息时从数组 ( ) 中获取它们(附件)
持有人在 recyclerview 中重复使用。我建议您在每次绑定之前“重置”持有人。在您的情况下,我建议在 holder 字段中保留指向 ImageView 的链接,并在绑定之前清除它。而且 TextView 中的文字也不会多此一举,一目了然。
尝试这样做:
如果没有附件,imageview 不会改变。并且有些情况下会加载旧的。他不在的时候有事可做