如何从Recyclerview打开片段?

问题描述

科特林 嗨,我想知道如何从recyclerview打开片段(例如,我要打开汽车项目cars_fragment,艺术品打开art_fragment ......)。

我将非常感谢您的帮助!谢谢!

这是我的适配器,我不添加clicklistner,因为运行代码时会出错

CategoriesAdapter

class CategoriesAdapter(var context: CategoriesFragment,var arrayList: ArrayList<CategoriesModel>) : RecyclerView.Adapter<CategoriesAdapter.ItemHolder>() {

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

    val itemHolder = LayoutInflater.from(parent.context)
        .inflate(R.layout.categorie_gridlayout,parent,false)
    return ItemHolder(itemHolder)
}

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

    val categoriesModel: CategoriesModel = arrayList[position]

    holder.images.setimageResource(categoriesModel.imagesGrid!!)
    holder.titles.text = categoriesModel.textGrid


}

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

class ItemHolder (itemView : View) : RecyclerView.ViewHolder(itemView) {

    var images = itemView.findViewById<ImageView>(R.id.categories_images)
    var  titles = itemView.findViewById<TextView>(R.id.categories_title)
}

}

这是我的Categories_fragment

Categories_fragment

class CategoriesFragment : Fragment() {

private var recyclerView : RecyclerView? = null
private var gridLayoutmanger : GridLayoutManager? = null
private var arrayList : ArrayList<CategoriesModel>? = null
private var categoriesAdapter : CategoriesAdapter? = null


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


}

override fun onCreateView(
    inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val rootView = inflater.inflate(R.layout.fragment_categories,container,false)

    recyclerView = rootView.findViewById(R.id.categories_recycler) as RecyclerView
    gridLayoutmanger = GridLayoutManager(context,2,linearlayoutmanager.VERTICAL,false)
    recyclerView?.layoutManager = gridLayoutmanger
    recyclerView?.setHasFixedSize(true)
    arrayList = ArrayList()
    arrayList = setDataInList()
    categoriesAdapter = CategoriesAdapter(this,arrayList!!)
    recyclerView?.adapter = categoriesAdapter
    return rootView

}

private fun setDataInList() : ArrayList<CategoriesModel>{

    val items : ArrayList<CategoriesModel> = ArrayList()

    items.add(CategoriesModel(R.drawable.drawable_cars,"CARS"))
    items.add(CategoriesModel(R.drawable.drawable_abstract,"ABSTRACT"))
    items.add(CategoriesModel(R.drawable.drawable_city,"CITY"))
    items.add(CategoriesModel(R.drawable.drawable_nature,"NATURE"))
    items.add(CategoriesModel(R.drawable.drawable_3d,"3D"))
    items.add(CategoriesModel(R.drawable.drawable_space,"SPACE"))
    items.add(CategoriesModel(R.drawable.drawable_love,"lovE"))
    items.add(CategoriesModel(R.drawable.drawable_minimalist,"MINIMLAIST"))
    items.add(CategoriesModel(R.drawable.drawable_art,"ART"))
    items.add(CategoriesModel(R.drawable.drawable_sport,"SPORT"))
    items.add(CategoriesModel(R.drawable.drawable_anime,"ANIME"))
    items.add(CategoriesModel(R.drawable.drawable_typography,"TYPOGRAPHY"))
    items.add(CategoriesModel(R.drawable.drawable_music,"MUSIC"))
    items.add(CategoriesModel(R.drawable.drawable_4k,"4K"))

    return items
}

}

解决方法

使用侦听器回调片段并打开另一个片段

第一步:定义接口

    interface CategoriesAdapterListener {

        fun itemClick()
    }

第二步:实现界面

class CategoriesFragment : Fragment(),CategoriesAdapterListener {

    override fun itemClick() {
      //open fragment
    }

第3步:将其传递给适配器

//modify adapter constructor parameter
categoriesAdapter = CategoriesAdapter(this,this,arrayList!!)

//modify adapter constructor
class CategoriesAdapter(
 var listener: CategoriesAdapterListener,var context: CategoriesFragment,var arrayList: ArrayList<CategoriesModel>)

第4步:单击viewHolder时回调

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

    val categoriesModel: CategoriesModel = arrayList[position]

    holder.images.setImageResource(categoriesModel.imagesGrid!!)
    holder.titles.text = categoriesModel.textGrid

    holder.titles.setOnClickListener {

      listener.itemClick()//callback
    }
}