Как я могу открывать фрагменты из Recyclerview?

#kotlin #android-recyclerview #fragment #adapter

#kotlin #android-recyclerview #фрагмент #адаптер

Вопрос:

котлин Привет, я хочу знать, как я могу открыть фрагмент из recyclerview, например (я хочу, чтобы элемент cars открывал cars_fragment, элемент art открывал 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
}
  

}

Ответ №1:

Используйте прослушиватель для обратного вызова фрагмента и открытия другого фрагмента

шаг 1: определение интерфейса

     interface CategoriesAdapterListener {

        fun itemClick()
    }
  

шаг 2: реализация интерфейса

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