Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
片段内RecyclerView的Kotlin OnItemClickListener_Kotlin_Android Fragments_Android Recyclerview_Onitemclicklistener - Fatal编程技术网

片段内RecyclerView的Kotlin OnItemClickListener

片段内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.

问题在于,我无法通过在适配器中实现OnClickListener来为位于“mainFragment”中的RecyclerView实现OnItemClick侦听器

我希望我的应用程序(kotlin)启动另一个片段(“下面代码中的deletePage”),每当单击RecyclerView中的itemView(一个ImageView)时,该片段都会以大屏幕显示相同的照片

我的适配器代码如下所示:

 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,但是在本例中,视图只能在适配器内部访问。要么我们将视图从一个适配器传递到另一个片段,要么适配器将通过回调通知该片段。如何在没有引用的情况下从适配器进行回调?