Android — Вложенное представление сетки внутри проблемы RecyclerView

#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 )