#java #android #android-recyclerview
Вопрос:
Я создаю приложение для чата, которое может отображать изображения в сообщениях.
Сообщения представляют собой пузырьки CardView внутри RecyclerView, но если сообщение содержит два или более изображений, содержимое этого элемента RecyclerView будет представлять собой сетку, в которой отображаются изображения.
До сих пор приложение работает плавно, пока я не прокручиваю вверх, а затем прокручиваю вниз , изображения в GridView будут меняться местами с другими в других сообщениях в разговоре, и иногда элементы становятся невидимыми:
Как вы можете видеть; чисел наложения на изображения, которые я сделал для отладки, чтобы подсчитать, сколько элементов передаются и что на самом деле изображено,
после прокрутки теперь элементы будут полностью скрыты и ничего не появляется, вместо этого он показывает отладки поле TextView справа, который говорит, сколько элементов в массиве изображения контуров, которое передается в GridView.
Адаптер GridView, который я использую :
package com.application.netapp.adapters;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.application.netapp.Attachments;
import com.application.netapp.ConversationActivity;
import com.application.netapp.ConversationViewMoreActivity;
import com.application.netapp.DB_Helper;
import com.application.netapp.MediaPreviewActivity;
import com.application.netapp.R;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
public class ConversationGridviewAdapter extends RecyclerView.Adapter<ConversationGridviewAdapter.ViewHolder> {
// ArrayList
ArrayList<String> Image;
Context context;
Activity activity;
String Att_ID;
String contactID;
SQLiteDatabase dbData;
DB_Helper dbHelper;
// constructor
public ConversationGridviewAdapter(Context context, Activity activity, ArrayList<String> Image, String Att_ID, String contactID) {
super();
dbHelper = new DB_Helper(context);
dbData = dbHelper.getReadableDatabase();
this.context = context;
//this.Image = Attachments.getAttachmentsPaths(Att_ID, dbData);
this.Image = Image;
this.Att_ID = Att_ID;
this.contactID = contactID;
this.activity = activity;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.convo_staggered_gridview, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onViewAttachedToWindow(@NonNull ViewHolder holder) {
super.onViewAttachedToWindow(holder);
System.out.println("***************************************************************************************************** onViewAttachedToWindow()");
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
// setting image resource
viewHolder.showmoreView.setVisibility(View.VISIBLE);
viewHolder.showmoreCount.setVisibility(View.VISIBLE);
viewHolder.showmoreCount.setText(getItemCount() ".");
viewHolder.imgview.setVisibility(View.VISIBLE);
if(i<=3)
{
viewHolder.imgview.setVisibility(View.VISIBLE);
viewHolder.imgview.setImageURI(Uri.fromFile(new File(Image.get(i))));
// TODO : onClick OpenMedia
if(i != 3)
{
viewHolder.imgview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Attachments.openImage(activity, new File(Image.get(i)));
}
});
}
else
{
if(Image.size()>4 amp;amp; i == 3)
{
// don't open onClick, open "More" Layout
viewHolder.imgview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent myIntent = new Intent(activity, ConversationViewMoreActivity.class);
myIntent.putExtra("attachmentID", Att_ID);
myIntent.putExtra("contactID", contactID);
myIntent.putExtra("list", (Serializable) Image);
activity.startActivity(myIntent);
}
});
}
else
{
viewHolder.imgview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Attachments.openImage(activity, new File(Image.get(i)));
}
});
}
}
System.out.println("TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT :: INSIDE the staggeredGridView : i=" i);
if (Image.size()==3 amp;amp; i==1)
{
// If the media count is 3, adjust the layout so it appears neat
int w = 300;
int h = 530;
RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams(w,h);
viewHolder.imgview.setLayoutParams(parms);
// TODO : onClick OpenMedia
viewHolder.imgview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Attachments.openImage(activity, new File(Image.get(i)));
}
});
}
if (Image.size()>4 amp;amp; i==3)
{
// If the media count is more than 4, show only 4 media and an overlay of ( n) in the fourth media while n is the number of
// additional media. when clicked, will open the whole message media layout.
int count = Image.size() - 4;
viewHolder.showmoreView.setVisibility(View.VISIBLE);
viewHolder.showmoreCount.setVisibility(View.VISIBLE);
viewHolder.showmoreCount.setText(" " count);
}
}
else
{
viewHolder.imgview.setVisibility(View.VISIBLE);
}
}
@Override
public int getItemCount() {
return Image.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView imgview;
public View showmoreView;
public TextView showmoreCount;
public ViewHolder(View itemView) {
super(itemView);
// getting ImageView reference
imgview = (ImageView) itemView.findViewById(R.id.imgView);
showmoreView = (View) itemView.findViewById(R.id.media_showmore_view);
showmoreCount = (TextView) itemView.findViewById(R.id.media_showmore_text);
}
}
}
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться кодом onBindViewHolder(). Кроме того, снимок экрана с проблемой поможет легче визуализировать проблему.
2. Когда прокрутка bindviewholder называется значениями изменений позиции ( i ), не полагайтесь на » i » в своем условии IF. переделай свою логику. если (Image.size()==3 )