Recyclerview onclick打开新片段

时间:2019-09-26 14:32:55

标签: android kotlin android-recyclerview

我在片段中有回收站视图。当我单击recyclerview中的一项时,我想打开新片段。我必须在适配器的列中看到图片:enter image description here我还创建了两个片段(fragment_opel和fragment chevrolet。)当用户单击雪佛兰行时,fragment_chevrolet必须打开。我是android studio的新手。在我的适配器中创建onclick方法。但是我不能填补那个职能。 :)您能帮我吗?

我的适配器:

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
    }


}

我的片段:

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)

    }


}

4 个答案:

答案 0 :(得分:1)

首先设置点击侦听器:

ViewHolder对象上设置一个点击侦听器。

  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) }
    }
}

我们设置了一个侦听器,在其中调用函数forwardClick(holder: AracMarkaViewHolder)。我们将当前的膨胀视图持有者引用传递给它,以便将来可以对其进行任何操作。

现在设置界面:

我们创建一个界面是因为我们希望该活动处理任何单击事件。就您而言,这些事件包括启动一个新片段。

interface ClickEventHandler {
    fun forwardClick(holder: AracMarkaViewHolder)
}

现在在您的适配器中,按如下所示设置界面:

private val clickHandler: ClickEventHandler = context as ClickEventHandler 

修改适配器类签名:

现在,我们需要稍微修改适配器的构造函数。

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

您的适配器类签名应如下所示:

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

实现界面:

现在,我们在活动中实现该接口。

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

答案 1 :(得分:1)

只需像这样在您的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")
        }
    }
}

答案 2 :(得分:1)

以防万一,这可以帮助使用Kotlin和Android Studio 4的任何人。

我正在片段中的RecycleView上使用适配器。如果要显示新的片段视图,则只能在mainactivity.kt类而不是适配器类中进行重写,因为它不在主线程上。

因此我在适配器中用于recyclerview的构造函数更改为:

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

然后我的适配器类中有一个变量:

 private val clickHandler: ClickEventHandler = context as ClickEventHandler

然后,我将适配器类中的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在我的适配器类中定义为:

  interface ClickEventHandler {
        fun viewFollow(holder: View)
    }

现在用于mainactivity中该函数的ovverride。我将ClickEventListener添加到MainActivity类中:

class MainActivity : AppCompatActivity(), ClickEventHandler {

然后我在mainactivity类中的适配器类中创建我的函数的覆盖函数:

 override fun viewFollow(holder: View) {
}

答案 3 :(得分:0)

您需要为适配器实现onClickListener接口。 之后,您可以设置您的recyclerview可见性消失,并且frameLayout可见。 现在将所需的片段发送到frameLayout中。

OR

主要活动中的实现适配器onClickListener并通过选定的recyclerview项目索引显示所需的片段