Android开发:跨Activity传递多选图片 实现RecyclerView图片展示
跨Activity传递选中多图实现列表同步展示的实现方案
现有代码存在的核心问题
- 目标
finalImage页面声明的imageModels集合未做有效初始化,传入Adapter的是空集合,无法加载任何图片内容 - 代码中强行初始化
ImagesActivity.imageList为新空集合的逻辑,直接覆盖了之前页面已经攒下的选中图片数据,根本无法拿到已选图的真实内容 - 跨页面直接依赖其他Activity的静态成员传值的方式稳定性差,遇到系统内存回收重建页面时,很容易出现数据丢失、空指针崩溃的问题
完整实现步骤
1. 前置数据适配
自定义的ImageModel类需要实现Parcelable接口,满足Android跨Activity传复杂对象集合的规范要求。
2. 跳转时随Intent携带完整选中集合
在第一个承载选图功能的页面,点击“完成”按钮触发跳转逻辑时,把当前页面已经维护好的选中图片集合,通过Intent的extra字段传给目标页面,核心代码示例:
// 完成按钮点击触发跳转 findViewById(R.id.btn_finish).setOnClickListener(v -> { Intent jumpIntent = new Intent(CurrentImagesActivity.this, finalImage.class); // 携带已选中的全部图片集合 jumpIntent.putParcelableArrayListExtra("selected_image_list", currentSelectedImages); startActivity(jumpIntent); });
3. 目标页接收数据后初始化列表
修正finalImage页面的初始化逻辑,删掉无意义的空集合重建代码,优先从Intent中取出传递过来的图片数据,赋值给Adapter的数据源后再做绑定:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_final_image); // 绑定布局内的RecyclerView fselectedImageRecyclerView = findViewById(R.id.fselected_recycler_view); fselectedImageRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); myImage = findViewById(R.id.image); imageView = findViewById(R.id.imageView); upload = findViewById(R.id.upload); // 从Intent接收跨页面传递的图片集合,增加非空校验适配页面重建场景 imageModels = getIntent().getParcelableArrayListExtra("selected_image_list"); if (imageModels == null) { imageModels = new ArrayList<>(); } // 传入真实有数据的集合初始化Adapter,绑定到RecyclerView finalAdapter = new finalAdapter(this, imageModels); fselectedImageRecyclerView.setAdapter(finalAdapter); }
4. 对齐原选图页逻辑修正Adapter
需要同步修正两个会影响展示效果的问题:
- 当前Glide加载逻辑直接把
ImageModel对象传给load()方法无法正常解析,需要取出模型类内封装的图片真实地址(本地路径/Uri)传入,才能和原选图页一样正常显示图片 - 原Adapter点击列表项跳转全屏预览页的逻辑,没有传递任何预览需要的参数,会导致预览页拿不到对应图片内容,可补充参数传递,和原选图页的交互体验完全保持一致
// 修正后的绑定逻辑 Glide.with(context) .load(imageModels.get(position).getImageUri()) // 替换为ImageModel中封装的图片地址字段 .placeholder(R.color.codeGray) .centerCrop() .into(holder.image); holder.image.setOnClickListener(v -> { Intent previewIntent = new Intent(context, FullImageActivity.class); // 传递完整图片集合、当前点击的位置索引,保证预览逻辑可用 previewIntent.putParcelableArrayListExtra("preview_image_list", imageModels); previewIntent.putExtra("current_position", position); context.startActivity(previewIntent); });
实操提示:如果选中的图片数量较多、单张图片文件较大,不要直接传递Bitmap对象,仅传递图片的本地Uri/路径字符串即可大幅降低传输体积,规避Intent传输的Binder大小超限问题。
内容的提问来源于stack exchange,提问作者Alex Yen
相关产品推荐
相关产品推荐

