繁体   English   中英

在回收器视图片段上实现点击监听器

[英]implement click listener on recycler view fragment

我像这样在适配器上使用点击监听器

在适配器中:

private var onItemClickListener: ((TansitionModel) -> Unit)? = null


override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val article = differ.currentList[position]
    holder.itemView.apply {

        setOnClickListener { shit->
            onItemClickListener?.let {
                it(article)
            }
        }
    }
}


fun setOnItemClickListener(listener: (TansitionModel) -> Unit) {
    onItemClickListener = listener 
}

在片段中:

    financeTransitionAdapter.setOnItemClickListener {

        val extras = FragmentNavigator.Extras.Builder()
            .addSharedElement(
                requireView().findViewById(R.id.imgsd),
                "trans").build()

        findNavController(requireView())
            .navigate(R.id.action_FirstFragment_to_showTransitionFragment,
                null,
                null,
                extras
        )
    }

现在有了这个架构,我如何将多个参数,如视图和其他数据类型(全部)从适配器单击侦听器传递到片段?

我没有您正在使用的适配器的完整代码,但我会尝试帮助我的项目中的一段代码。

首先,您需要做的是创建一个这样的界面:

interface AccountClickListener {
    fun onAccountClick(savedAccountModel: SavedAccountModel)
}

您可以向此 function 添加任意数量的参数。

现在在您的适配器 class 构造函数中实现此接口,如下所示:

class ChangeAccountAdapter(
val context: Context,
val arrayList: ArrayList<SavedAccountModel>, 
val accountClickListener : AccountClickListener) 
: RecyclerView.Adapter<ChangeAccountAdapter.ChangeAccountHolder>(){
//your adapter class code
}

您的支架 Class 应如下所示:

 inner class ChangeAccountHolder(val itemView : View) : RecyclerView.ViewHolder(itemView){
        val imageView : ImageView = itemView.findViewById(R.id.savedaccountimg)
        init {
          imageView.setOnClickListener{accountClickListener.onAccountClick(arrayList[adapterPosition])}
    }

现在,您可以在您的活动或片段中实现您的点击侦听器,如下所示:

class Profile : Fragment(), AccountClickListener{
    override fun onAccountClick(savedAccountModel: SavedAccountModel) {
    // Code for what you want to do on clicking the item.
    }
}

最后,您可以像这样定义您的适配器:

  val adapter = ChangeAccountAdapter(requireContext(),modelList,this)

对于此架构,您只需更改您使用的 lambda 的接收器。 也许像这样。

private var onItemClickListener: ((TansitionModel,String, View) -> Unit) = {_, _, _ ->} // maybe use it like this instead of making it null

fun setOnItemClickListener(listener: (TansitionModel,String, View) -> Unit) {
    onItemClickListener = listener
}

然后使用附加参数调用它。 然后你可以像这样使用它们。

    financeTransitionAdapter.setOnItemClickListener { model, myString, view ->
        // use the variables
    }

但是,我建议使用其他答案所建议的界面方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM