首页 > 解决方案 > 如何从 RecyclerView 读取数据并发送到 BottomSheet

问题描述

我正在使用 recyclerView 显示设备中安装的应用程序列表

图片 -链接

有关更多详细信息,我在 LongPress 上使用 bottomSheet,即在 ViewHolder 类中,但如何将所选选项卡的数据发送到 bottomSheet并提供更多详细信息(例如包名称、API 级别等)...供参考,请参阅图片

我要 -链接

我从下面的编码中得到 -链接

MainActivity.kt

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
 
    recyclerView.adapter = Adapter // I set adapter here with function getApps()
    recyclerView.layoutManager = LinearLayoutManager(this)

private fun getApps(): List<DataClass> {

    // here I get apps icon,name,size and return list<DataClass>
       
  return list
}

适配器.kt

    class Adapter(private val listOfApps: List<AppData>) :
    RecyclerView.Adapter<Adapter.ViewHolder>() {

    class ViewHolder(appView: View) : RecyclerView.ViewHolder(appView), View.OnClickListener,
        View.OnLongClickListener {

        init {
            appView.setOnClickListener(this)
            appView.setOnLongClickListener(this)
        }

        val icon: ImageView = appView.App_icon
        val name: TextView = appView.App_name
        val size: TextView = appView.App_size

        override fun onClick(v: View?) {
            Toast.makeText(v?.context, "OnClick", Toast.LENGTH_SHORT).show()
        }

        override fun onLongClick(v: View?): Boolean { 
         
           // I want here on Long press BottomSheet appears with details

            val bottomSheetDialog = BottomSheetDialog()
            // Show bottomSheet on LongPress
            bottomSheetDialog.show(
                (v?.context as FragmentActivity).supportFragmentManager, bottomSheetDialog.tag
            )
            return true
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(
            R.layout.list_apps, parent, false
        )
        return ViewHolder(view)
    }

    override fun getItemCount() = listOfApps.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        val currentItem = listOfApps[position]
        holder.icon.setImageDrawable(currentItem.icon)
        holder.name.text = currentItem.name
        holder.size.text = currentItem.size
    }
}

BottomSheetDialog.kt

    class BottomSheetDialog: BottomSheetDialogFragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.bottom_sheet, container, false)

    }

    override fun getTheme(): Int = R.style.RoundBottomSheetDialog
}

数据类

    data class AppData(
    val icon: Drawable,
    val name: String,
    val size: String,
)

标签: androidkotlinandroid-recyclerviewandroid-adapterbottom-sheet

解决方案


使用您当前的代码,最简单的解决方案是:

  1. 修改您的 BottomSheetDialog 以在构造函数中包含 AppData

    类BottomSheetDialog(val appData:AppData):BottomSheetDialogFragment(){

     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
         return inflater.inflate(R.layout.bottom_sheet, container, false)
     }
    
     override fun getTheme(): Int = R.style.RoundBottomSheetDialog
    

    }

  2. 在 ViewHolder 类中添加 onBind 方法:

     fun onBind(appData: AppData) {
         icon.setImageDrawable(currentItem.icon)
         name.text = currentItem.name
         size.text = currentItem.size
     }
    
  3. 修改 Adapter 中的 onBindViewHolder 方法以调用该 onBind 方法:

    覆盖乐趣 onBindViewHolder(holder: ViewHolder, position: Int) { holder.onBind(listOfApps[position]) }

  4. 在您的 ViewHolder 中添加lateinit var currentItem: AppData将在 onBind 中设置的内容,我们可以在以下位置使用它onLongClick

    类 ViewHolder(appView: View) : RecyclerView.ViewHolder(appView), View.OnClickListener, View.OnLongClickListener { . . . 覆盖 fun onLongClick(v: View?): Boolean {

         // I want here on Long press BottomSheet appears with details
         **val bottomSheetDialog = BottomSheetDialog(currentItem)**
         // Show bottomSheet on LongPress
         bottomSheetDialog.show(
             (v?.context as FragmentActivity).supportFragmentManager, bottomSheetDialog.tag
         )
         return true
     }
    
     **private lateinit var currentItem: AppData**
    
     fun onBind(appData: AppData) {
         **currentItem = appData**
         icon.setImageDrawable(currentItem.icon)
         name.text = currentItem.name
         size.text = currentItem.size
     }
    

推荐阅读