【问题标题】:How to pass data from RecyclerView's click listener to another fragment?如何将数据从 RecyclerView 的点击监听器传递到另一个片段?
【发布时间】:2022-11-10 22:57:28
【问题描述】:

在我的程序中,我有一个带适配器的 RecyclerView,我在其中检查单击了 RecyclerView 的哪个元素。

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val currentBreakfast = breakfastList[position]
    holder.breakfastTitle.text = context.getText(currentBreakfast.breakfastStringResourceId)
    holder.breakfastImage.setImageResource(currentBreakfast.breakfastImageResourceId)

    holder.breakfastImage.setOnClickListener {
        holder.itemView.findNavController().navigate(R.id.action_breakfastFragment_to_DetailsFragment)
        showDetails(currentBreakfast)
    }
}

我想传递有关特定单击元素的数据,例如图像标识,字符串 ID,姓名等到另一个片段细节片段我想在其中显示更多数据

我该怎么做?

【问题讨论】:

    标签: android kotlin android-fragments android-recyclerview


    【解决方案1】:

    有几种方法。

    我建议您看一下这个答案(已接受的答案): How to pass data from adapter to fragment?

    然后转到名为“一种更 Kotlin 的方法是忽略接口并只传递一个函数”的部分。

    这也是我自己使用的方法。

    这是我的 RecyclerView 适配器如何定义的示例:

    class ReportAdapter(var reports: List<Report>,val clickFunc : (Report) -> (Unit)) :  RecyclerView.Adapter<ReportAdapter.ViewHolder>() {...}
    

    然后你需要将回调函数附加到你的视图中的点击监听器——在我的例子中它看起来像这样(列表中的每个项目都有一个卡片视图——在 xml 文件中定义):

    itemView.report_cardview_item.setOnClickListener {
                    clickFunc(report)
                }
    

    然后在传递给 RecylerView 适配器的回调函数中,您可以导航到包含相关数据的详细信息片段 - 我的回调函数之一(在创建时传递给适配器)看起来像这样(在“拥有”的片段中定义" 回收站视图):

    private fun reportClicked(report:Report)
        {
            val action = ReportsFragmentDirections.actionNavReportsToReportDetailFragment(report)
            findNavController().navigate(action)
        }
    

    (这里使用我的导航图创建用于 NavController 的操作)

    我的适配器很容易用一些数据和对回调函数的引用进行初始化:

       adapter = ReportAdapter(reports,::reportClicked)
    

    【讨论】:

    • 没看懂,能不能提供更多代码?
    【解决方案2】:

    您需要将片段发送到您调用的适配器,我猜它是早餐片段,只需添加 this 即可:

                YourAdapter(
                    requireActivity(),
                    breakfastList,
                    this
                )
    

    你的适配器得到fragment

    open class YourAdapter(
        private val context: Context,
        private var breakfastList: ArrayList<Breakfast>,
        private val fragment: Fragment
    ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    

    你可以使用fragment 来导航:

    holder.breakfastImage.setOnClickListener {
    // create a bundle to hold data you want to send
     val bundle = bundleOf(
       "imageId" to currentBreakfast.imageId,
       "stringId" to currentBreakfast.stringId,
       "name" to currentBreakfast.name
     )
    // add this bundle when you move to another fragment.              
    fragment.findNavController().navigate(R.id.action_breakfastFragment_to_DetailsFragment, bundle)
    }
    

    在另一个片段中获取该值并在日志中查看它们,如下所示:

    // create below variables
    private var mImageId: String = ""
    private var mStringId: String = ""
    private var mName: String = ""
    
    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            // Now we set above values with what we sent from adapter
            arguments?.let {
                if (it["imageId"] != null) {
                    mImageId = it.getString("imageId")!!
                }
                if (it["stringId"] != null) {
                    mStringId = it.getString("stringId")!!
                }
                if (it["name"] != null) {
                    mName = it.getString("name")!!
                }
            }
            return inflater.inflate(R.layout.fragment_question_stats, container, false)
        }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            // now you can do whatever you want with mImageId, mStringId and mName.
    
    }
    
    

    附:我只是编了一些变量和类名,因为您没有共享它们,只需将其更改为您的正确名称即可。

    【讨论】:

    • 你能展示一下如何使用片段中的变量,而不是仅仅将它们显示到日志中吗?
    • 如果您设法做到这一点,则很容易在整个新片段中使用这些变量。我为此编辑了答案。
    猜你喜欢
    • 2021-12-26
    • 2022-07-07
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多