首页 > 解决方案 > Android - RecyclerView 内的嵌套 GridView 问题

问题描述

我正在创建一个聊天应用程序,它可以在消息中显示图像。
消息是 RecyclerView 内的 CardView 气泡,但如果消息包含两个或更多图像,则该 RecyclerView 元素的内容将是显示图像的 GridView。

到目前为止,该应用程序是流畅的,直到我向上滚动然后向下滚动,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 && 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 && 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 && 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);
        }
    }
}

标签: javaandroidandroid-recyclerview

解决方案


推荐阅读