片段内RecyclerView的Kotlin OnItemClickListener
问题在于,我无法通过在适配器中实现OnClickListener来为位于“mainFragment”中的RecyclerView实现OnItemClick侦听器 我希望我的应用程序(kotlin)启动另一个片段(“下面代码中的deletePage”),每当单击RecyclerView中的itemView(一个ImageView)时,该片段都会以大屏幕显示相同的照片 我的适配器代码如下所示:片段内RecyclerView的Kotlin OnItemClickListener,kotlin,android-fragments,android-recyclerview,onitemclicklistener,Kotlin,Android Fragments,Android Recyclerview,Onitemclicklistener,问题在于,我无法通过在适配器中实现OnClickListener来为位于“mainFragment”中的RecyclerView实现OnItemClick侦听器 我希望我的应用程序(kotlin)启动另一个片段(“下面代码中的deletePage”),每当单击RecyclerView中的itemView(一个ImageView)时,该片段都会以大屏幕显示相同的照片 我的适配器代码如下所示: class MyAdapter : RecyclerView.Adapter<MyAdapter.
class MyAdapter : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
private var photo = emptyList<Photo>()
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.row_layout, parent, false)
)
}
override fun getItemCount(): Int {
return photo.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.itemView.longitude.text = photo[position].latitude
holder.itemView.latitude.text = photo[position].longitude
holder.itemView.imageView.load(photo[position].photo)
}
fun setData(photo: List<Photo>) {
this.photo = photo
notifyDataSetChanged()
}
}
class MainFragment : Fragment(){
private lateinit var myView: MyViewModel
private val adapter by lazy { MyAdapter() }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_main, container, false)
//Recyclerview
val adapter = MyAdapter()
val recyclerView = view.recycler_view
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(requireContext())
myView = ViewModelProvider(this).get(MyViewModel::class.java)
myView.readPhoto.observe(viewLifecycleOwner, Observer {photo ->
adapter.setData(photo)
})
setHasOptionsMenu(true)
return view
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_database, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when {
item.itemId == R.id.deleteAll -> findNavController().navigate(R.id.deletePage)
item.itemId == R.id.refresh -> {
Toast.makeText(activity, "yep", Toast.LENGTH_SHORT).show()
instertDataToDatabase()
}
}
if (item.itemId == R.id.deleteAll) {
}
return super.onOptionsItemSelected(item)
}
}
目标是,当您单击RecyclerView的某个项目时,会显示“findNavController().navigate(R.id.deletePage)”片段,但每次我尝试实施解决方案时,当单击RecyclerView的某个项目时,应用程序都会崩溃。现在,通过单击工具栏菜单中的一个按钮来导航,但这不是理想的解决方案
任何形式的帮助或建议都将不胜感激 首先,您需要在
onBindViewHolder
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.itemView.longitude.text = photo[position].latitude
holder.itemView.latitude.text = photo[position].longitude
holder.itemView.imageView.load(photo[position].photo)
holder.itemView.setOnClickListener { navigateToFragment() }
}
对于导航,您应该有一个上下文实例。
以下是我想到的可能的解决方案:
private val navigator = Navigator(this)
...
val adapter = MyAdapter(navigator)
class MainFragment : Fragment(), Navigable{
...
override fun navigate(){
// make your navigation
}
val adapter = MyAdapter(navigator)
在适配器中:
class MyAdapter(private val navigator: Navigator) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
fun navigateToFragment(){
navigator.navigate()
}
class MyAdapter(private val navigable: Navigable) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
fun navigateToFragment(){
navigable.navigate()
}
在你的片段中:
private val navigator = Navigator(this)
...
val adapter = MyAdapter(navigator)
class MainFragment : Fragment(), Navigable{
...
override fun navigate(){
// make your navigation
}
val adapter = MyAdapter(navigator)
在适配器中:
class MyAdapter(private val navigator: Navigator) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
fun navigateToFragment(){
navigator.navigate()
}
class MyAdapter(private val navigable: Navigable) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
fun navigateToFragment(){
navigable.navigate()
}
我不认为适配器应该实现点击逻辑或保留对主机片段的引用。相反,我认为公开回调并使用它实现片段的操作将是一个更好的解决方案。我更喜欢使用数据绑定和从xml发出click listener,但是在本例中,视图只能在适配器内部访问。要么我们将视图从一个适配器传递到另一个片段,要么适配器将通过回调通知该片段。如何在没有引用的情况下从适配器进行回调?