startActivityForResult废弃后,BottomNavigationView选图显示到RecyclerView的方案
实现方案(替代startActivityForResult的图片选择与RecyclerView展示)
1. 注册Activity Result Launcher
在你的Activity或Fragment中,使用Activity Result API替代已废弃的startActivityForResult,先注册用于选择图片的启动器:
Kotlin 代码
// 作为Activity/Fragment的成员变量 private val pickImageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> uri?.let { selectedUri -> // 处理选中的图片Uri addImageToRecyclerView(selectedUri) } }
Java 代码
// 成员变量 private ActivityResultLauncher<String> pickImageLauncher; // 在onCreate()中初始化 pickImageLauncher = registerForActivityResult( new ActivityResultContracts.GetContent(), uri -> { if (uri != null) { addImageToRecyclerView(uri); } } );
2. 监听BottomNavigationView的选中事件
设置导航项的选中监听,当点击R.id.status时触发图片选择:
Kotlin 代码
bottomNavigationView.setOnItemSelectedListener { item -> when (item.itemId) { R.id.status -> { // 启动图片选择器,指定仅选择图片类型 pickImageLauncher.launch("image/*") true } // 处理其他导航项 else -> false } }
Java 代码
bottomNavigationView.setOnItemSelectedListener(item -> { if (item.getItemId() == R.id.status) { pickImageLauncher.launch("image/*"); return true; } return false; });
3. 处理图片并更新RecyclerView
定义数据源与适配器
首先维护一个存储图片Uri的数据源,再实现RecyclerView的适配器用于展示图片:
数据源初始化(Kotlin)
private val imageUris = mutableListOf<Uri>() private lateinit var statusAdapter: StatusAdapter
适配器示例(Kotlin)
class StatusAdapter(private val imageUris: List<Uri>) : RecyclerView.Adapter<StatusAdapter.ViewHolder>() { inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val statusImage: ImageView = itemView.findViewById(R.id.status_image) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_status_image, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val imageUri = imageUris[position] // 用Glide加载图片(需添加Glide依赖),也可使用Picasso或原生API Glide.with(holder.statusImage.context) .load(imageUri) .centerCrop() .into(holder.statusImage) } override fun getItemCount() = imageUris.size }
初始化RecyclerView(Kotlin)
// 在onCreate()或onViewCreated()中 statusList.apply { layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) statusAdapter = StatusAdapter(imageUris) adapter = statusAdapter }
更新RecyclerView数据
实现添加图片并刷新列表的方法:
private fun addImageToRecyclerView(uri: Uri) { imageUris.add(uri) // 通知适配器插入新数据,优化性能 statusAdapter.notifyItemInserted(imageUris.size - 1) // 可选:自动滚动到最新添加的图片 statusList.smoothScrollToPosition(imageUris.size - 1) }
4. 权限注意事项
- Android 13及以上:需要申请
READ_MEDIA_IMAGES权限 - Android 12及以下:需要申请
READ_EXTERNAL_STORAGE权限 - 可在代码中动态申请权限,确保图片选择器能正常访问设备存储。
内容的提问来源于stack exchange,提问作者Mr. X
相关产品推荐
相关产品推荐

