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