简体   繁体   English

Recyclerview onclick 打开新片段

[英]Recyclerview onclick to open new fragment

I have recycleview in fragment.我在片段中有recycleview。 When i click one of the items in recyclerview,ı want to open new fragment.当我单击 recyclerview 中的一项时,我想打开新片段。 I have to column in my adapter as you see picture:如您所见,我必须在我的适配器中列: 在此处输入图像描述 I have created two fragment also.(fragment_opel and fragment chevrolet.)when user click chevrolet row, fragment_chevrolet have to open.I am new about android studio.I create onclick method in my adapter.我还创建了两个片段。(fragment_opel 和片段雪佛兰。)当用户单击雪佛兰行时,片段雪佛兰必须打开。我是 android 工作室的新手。我在我的适配器中创建 onclick 方法。 But i cannot fill that function.但我无法填写 function。 :) Can you help me about it please? :) 你能帮我一下吗?

My adapter:我的适配器:

package com.example.parcaburada



class AracMarkaAdapter(tumKategori: ArrayList<AracMarka>) :
    RecyclerView.Adapter<AracMarkaAdapter.AracMarkaViewHolder>() {


    var araclar = tumKategori

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AracMarkaViewHolder {

        var inflater = LayoutInflater.from(parent.context)
        var arackategori = inflater.inflate(R.layout.arac_kategori, parent, false)

        return AracMarkaViewHolder(arackategori)

    }

    override fun getItemCount(): Int {
        return araclar.size
    }

    override fun onBindViewHolder(holder: AracMarkaViewHolder, position: Int) {


        holder.aracismi.text = araclar.get(position).aracAdi
        holder.aracLogo.setImageResource(araclar.get(position).aracLogo)


    }


    class AracMarkaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
        View.OnClickListener {
        override fun onClick(v: View?) {


        }


        var teksatirKategori = itemView
        var aracismi = teksatirKategori.tvaracAdi
        var aracLogo = teksatirKategori.img_arac_sembol
    }


}

My fragment:我的片段:

package com.example.parcaburada.ui.kategori



class KategoriFragment : Fragment() {
    var araclarKategori = ArrayList<AracMarka>()


    private lateinit var galleryViewModel: GalleryViewModel

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        veriKaynaginiDoldur()
        galleryViewModel =
            ViewModelProviders.of(this).get(GalleryViewModel::class.java)
        var root = inflater.inflate(R.layout.fragment_category, container, false)

        var rvarackategori = root.findViewById(R.id.rvarackategori) as RecyclerView
        var MyAdapter = AracMarkaAdapter(araclarKategori)
        rvarackategori.adapter = MyAdapter

        var linearLayoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
        rvarackategori.layoutManager = linearLayoutManager

        return root
    }

    fun veriKaynaginiDoldur(): ArrayList<AracMarka> {

        var aracLogo = arrayOf(R.drawable.opellogo, R.drawable.chevroletlogo)
        var aracismi = resources.getStringArray(R.array.arabaisim)

        for (i in 0 until min(aracismi.size, aracLogo.size)) {

            var eklenecekaracKategori = AracMarka(aracismi[i], aracLogo[i])
            araclarKategori.add(eklenecekaracKategori)
        }
        return araclarKategori

    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

    }


}

First setup a click listener:首先设置一个点击监听器:

Set a click listener on the ViewHolder object.ViewHolder object 上设置点击监听器。

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AracMarkaViewHolder {

    var inflater = LayoutInflater.from(parent.context)
    var arackategori = inflater.inflate(R.layout.arac_kategori, parent, false)

    return AracMarkaViewHolder(arackategori).also {
       arackategori.setOnClickListener { clickHandler.forwardClick(it) }
    }
}

We setup a listener, where we invoke the function forwardClick(holder: AracMarkaViewHolder) .我们设置了一个监听器,我们在其中调用 function forwardClick(holder: AracMarkaViewHolder) We pass the current inflated view holder reference to it so that we can do any future operations on it.我们将当前膨胀的视图持有者引用传递给它,以便我们可以对它进行任何未来的操作。

Now setup an interface:现在设置一个界面:

We create an interface because we want any click event to be handeled by the activity.我们创建一个界面是因为我们希望任何点击事件都由活动处理。 Those events, in your case include, launching a new fragment.在您的情况下,这些事件包括启动一个新片段。

interface ClickEventHandler {
    fun forwardClick(holder: AracMarkaViewHolder)
}

Now in your adapter, setup the interface like this:现在在您的适配器中,设置如下界面:

private val clickHandler: ClickEventHandler = context as ClickEventHandler 

Modify adapter class signature:修改适配器 class 签名:

Now, we need to slightly modify adapter's constructor.现在,我们需要稍微修改适配器的构造函数。

var MyAdapter = AracMarkaAdapter(araclarKategori, requireContext()) //We pass the activity's context. 

And your adapter class signature should look something like this:您的适配器 class 签名应如下所示:

 class AracMarkaAdapter(tumKategori: ArrayList<AracMarka>, context: Context) :
   RecyclerView.Adapter<AracMarkaAdapter.AracMarkaViewHolder>() {
        private val clickHandler: ClickEventHandler = context as ClickEventHandler 
  }   

Implement the interface:实现接口:

Now we implement the interface in the activity.现在我们在活动中实现接口。

class MainActivity : AppCompatActivity(), ClickEventHandler  {
  override fun forwardClick(holder: AracMarkaViewHolder) {
     //Launch a new fragment here.
  }
}

Just implement the "go to fragment" in your onBindViewHolder method like this-只需像这样在onBindViewHolder方法中实现“转到片段”-

override fun onBindViewHolder(holder: AracMarkaViewHolder, position: Int) {
    holder.aracismi.text = araclar.get(position).aracAdi
    holder.aracLogo.setImageResource(araclar.get(position).aracLogo)
    holder.setOnClickListener {
        if (position == 0) {
            TODO("Go to first fragment")
        } else {
            TODO("Go to second fragment")
        }
    }
}

Just in case this helps anyone who's using Kotlin and Android Studio 4.以防万一这有助于任何使用 Kotlin 和 Android Studio 4 的人。

I'm using adapters on a RecycleView in a fragment.我在片段中的 RecycleView 上使用适配器。 You can only do the override in the mainactivity.kt class not the adapter class as it's not on the main thread if you're going to show a new fragment view.您只能在 mainactivity.kt class 而不是适配器 class 中进行覆盖,因为如果您要显示新的片段视图,它不在主线程上。

So my constructor in my adapter for my recyclerview is changed to:因此,我的 recyclerview 适配器中的构造函数更改为:

class MyFollowRecyclerViewAdapter(
    private val values: List<FollowItem>,
    private val context: Context
)

Then I have a variable in my adapter class:然后我的适配器 class 中有一个变量:

 private val clickHandler: ClickEventHandler = context as ClickEventHandler

Then I added the setOnClickListener in my adapter class to the onCreateViewHolder method:然后我将适配器 class 中的 setOnClickListener 添加到 onCreateViewHolder 方法中:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(layout.fragment_item_follow, parent, false)
        view.setOnClickListener {
            clickHandler.viewFollow(it)
        }
        return ViewHolder(view)
    }

ClickEventHandler is defined in my adapter class as: ClickEventHandler 在我的适配器 class 中定义为:

  interface ClickEventHandler {
        fun viewFollow(holder: View)
    }

Now for the ovverride of the function in mainactivity.现在在 mainactivity 中覆盖 function。 I add ClickEventListener to my MainActivity class:我将 ClickEventListener 添加到我的 MainActivity class:

class MainActivity : AppCompatActivity(), ClickEventHandler {

Then I create my override function of the function defined in my adapter class in my mainactivity class:然后我在我的主活动 ZA2F2ED4F8EBC2ABC1DDC40 中定义在我的适配器 class 中定义的 function 的覆盖 function :

 override fun viewFollow(holder: View) {
}

you need to implement an onClickListener interface for your adapter.你需要为你的适配器实现一个 onClickListener 接口。 after that you can set your recyclerview visibility gone and frameLayout Visible.之后,您可以设置您的 recyclerview 可见性消失和 frameLayout Visible。 now send which fragment that you want into frameLayout.现在将您想要的片段发送到 frameLayout。

OR或者

implement adapter onClickListener in your main activity and show which fragment you want by selected recyclerview item index在您的主要活动中实现适配器 onClickListener 并通过选定的 recyclerview 项目索引显示您想要的片段

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

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