Navigation.createNavigateOnClickListener 来自 onBindViewHolder?
Navigation.createNavigateOnClickListener from onBindViewHolder?
我想在 onBindViewHolder
中设置一个 onclicklistener,以便导航到不同的片段并将一些数据发送到该片段。
对于我的生活,我似乎无法找到让它发挥作用的方法。非常感谢任何帮助!
适配器class:
class ListAdapter(private val list: List<Workout>): RecyclerView.Adapter<WorkoutViewHolder>() {
override fun getItemCount(): Int{
return list.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WorkoutViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
return WorkoutViewHolder(layoutInflater, parent)
}
override fun onBindViewHolder(holder: WorkoutViewHolder, position: Int) {
val workout: Workout = list[position]
holder.itemView.setOnClickListener{
Toast.makeText(holder.itemView.context, "TEST", Toast.LENGTH_LONG).show()
val id = workout.workoutId
val bundle = Bundle()
bundle.putInt("workoutId", id)
Navigation.createNavigateOnClickListener(R.id.workoutDetailsFragment)
}
holder.bind(workout)
}
}
我可以让 toast 弹出,所以 onclicklistener 似乎可以正常工作。但是,导航部分不起作用。
如果我只是在托管 recyclerview 的片段内设置一个按钮并添加 button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.workoutDetailsFragment))
它可以很好地导航。所以问题似乎是从 onbindviewholder
内的 onclicklistener 内部调用导航函数
Navigation.createNavigateOnClickListener()
创建一个 OnClickListener
。创建一个 OnClickListener
只是为了从不将它设置在任何东西上没有任何作用。
相反,您只想直接触发 navigate()
调用,执行与 createNavigateOnClickListener
内部相同的 one line of code:
override fun onBindViewHolder(holder: WorkoutViewHolder, position: Int) {
val workout: Workout = list[position]
holder.itemView.setOnClickListener{
Toast.makeText(holder.itemView.context, "TEST", Toast.LENGTH_LONG).show()
val id = workout.workoutId
val bundle = Bundle()
bundle.putInt("workoutId", id)
// Using the Kotlin extension in the -ktx artifacts
// Alternatively, use Navigation.findNavController(holder.itemView)
holder.itemView.findNavController().navigate(
R.id.workoutDetailsFragment, bundle)
}
holder.bind(workout)
}
您需要分配您创建的侦听器,而不是在 lambda 内部使用它。当您将 lambda 与 setOnClickListener()
一起使用时,lambda 字面意思就是您的侦听器。因此,在您的示例中,您正在创建一个侦听器,但它从未分配到任何地方。
因此,要从 Navigation.createNavigateOnClickListener()
分配创建的侦听器,您的代码应类似于 holder.itemView.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.workoutDetailsFragment))
我想在 onBindViewHolder
中设置一个 onclicklistener,以便导航到不同的片段并将一些数据发送到该片段。
对于我的生活,我似乎无法找到让它发挥作用的方法。非常感谢任何帮助!
适配器class:
class ListAdapter(private val list: List<Workout>): RecyclerView.Adapter<WorkoutViewHolder>() {
override fun getItemCount(): Int{
return list.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WorkoutViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
return WorkoutViewHolder(layoutInflater, parent)
}
override fun onBindViewHolder(holder: WorkoutViewHolder, position: Int) {
val workout: Workout = list[position]
holder.itemView.setOnClickListener{
Toast.makeText(holder.itemView.context, "TEST", Toast.LENGTH_LONG).show()
val id = workout.workoutId
val bundle = Bundle()
bundle.putInt("workoutId", id)
Navigation.createNavigateOnClickListener(R.id.workoutDetailsFragment)
}
holder.bind(workout)
}
}
我可以让 toast 弹出,所以 onclicklistener 似乎可以正常工作。但是,导航部分不起作用。
如果我只是在托管 recyclerview 的片段内设置一个按钮并添加 button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.workoutDetailsFragment))
它可以很好地导航。所以问题似乎是从 onbindviewholder
Navigation.createNavigateOnClickListener()
创建一个 OnClickListener
。创建一个 OnClickListener
只是为了从不将它设置在任何东西上没有任何作用。
相反,您只想直接触发 navigate()
调用,执行与 createNavigateOnClickListener
内部相同的 one line of code:
override fun onBindViewHolder(holder: WorkoutViewHolder, position: Int) {
val workout: Workout = list[position]
holder.itemView.setOnClickListener{
Toast.makeText(holder.itemView.context, "TEST", Toast.LENGTH_LONG).show()
val id = workout.workoutId
val bundle = Bundle()
bundle.putInt("workoutId", id)
// Using the Kotlin extension in the -ktx artifacts
// Alternatively, use Navigation.findNavController(holder.itemView)
holder.itemView.findNavController().navigate(
R.id.workoutDetailsFragment, bundle)
}
holder.bind(workout)
}
您需要分配您创建的侦听器,而不是在 lambda 内部使用它。当您将 lambda 与 setOnClickListener()
一起使用时,lambda 字面意思就是您的侦听器。因此,在您的示例中,您正在创建一个侦听器,但它从未分配到任何地方。
因此,要从 Navigation.createNavigateOnClickListener()
分配创建的侦听器,您的代码应类似于 holder.itemView.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.workoutDetailsFragment))