java - 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);
}
}
}
解决方案
推荐阅读
- prolog - Prolog - 检测有向图中连接节点的谓词
- c# - 使方法易于由第三方调用和配置的最佳方法
- asp.net-core - 在 VS 2019 预览版中没有可用于使用 .Net Core 3.0 的选项
- git - 收到 git push 错误:“您无法推送以下提交,因为它们是由作者姓名不知道 Stash 的用户创作的”
- javascript - 使用 MSE 将低延迟 avc/h264 视频流式传输到浏览器
- mysql - 错误 1109 (42S02):MULTI DELETE 中的未知表
- html - 如何在引导程序中将图像放在移动视图中的滑块上方?
- image - 如何将 .fig 文件中的图形保存为具有更高 dpi 的图像?
- sql-server - 如何从远程服务器访问文件以在我的文件系统中进行批量加载?
- java - 即使头文件中存在列表仍然无法正常工作,为什么?