我有一个适配器,它用 3 种布局 (LinerLayout) 填充CardView,而它们又包含一个TextView和一个 ImageView。当填充列表(当它离开屏幕时)并翻转它时,上面的元素混合在一起,几个TextViews可以进入一个LinearLayout。
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 lparams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams lparamsFile = new LinearLayout.LayoutParams(150, 150);
LinearLayout.LayoutParams mLayout = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout mLinerLayout = new LinearLayout(ctx); //Основной контейнер
mLinerLayout.setOrientation(LinearLayout.VERTICAL);
mLinerLayout.setLayoutParams(mLayout);
LinearLayout linearLayoutTextContent = new LinearLayout(ctx); //Контейнер для текста сообщения
linearLayoutTextContent.setOrientation(LinearLayout.HORIZONTAL);
linearLayoutTextContent.setLayoutParams(lparams);
LinearLayout linearLayoutFileContent = new LinearLayout(ctx); //Контейнер для вложения
linearLayoutFileContent.setOrientation(LinearLayout.HORIZONTAL);
linearLayoutFileContent.setLayoutParams(lparams);
linearLayoutFileContent.setPadding(10,10,10,10);
TextView messageContent = new TextView(ctx); //Текст сообщения
messageContent.setLayoutParams(lparams);
messageContent.setPadding(20,20,20,20);
messageContent.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;
}
linearLayoutFileContent.addView(file);
}
}
linearLayoutTextContent.addView(messageContent); //Добавление заполненного контейнера в диалог
if(messages.get(position).getFile() != null && !(messages.get(position).getContent().equals("null"))) { // Сообщение и вложение
mLinerLayout.addView(linearLayoutTextContent);
mLinerLayout.addView(linearLayoutFileContent);
holder.cv.addView(mLinerLayout);
} else if(messages.get(position).getFile() != null && messages.get(position).getContent().equals("null")){ // Вложение
mLinerLayout.addView(linearLayoutFileContent);
holder.cv.addView(mLinerLayout);
} else if(messages.get(position).getFile() == null && !(messages.get(position).getContent().equals("null"))) { // Сообщение
mLinerLayout.addView(linearLayoutTextContent);
holder.cv.addView(mLinerLayout);
}
}
@Override
public int getItemCount() {
return messages.size();
}
public static class MSGViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
CardView cv;
public MSGViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.msg_card);
}
@Override
public void onClick(View view) {
}
}
您没有正确使用适配器。所有元素创建都应在
onCreateViewHolder().onBindViewHolder()接收对当时创建的结构的引用onCreateViewHolder()(即所有视图都已创建)并专门控制它们的可见性、外观和显示数据。