Кажется, у вас возникают трудности в понимании того, как работает RecyclerView
.
Должен ли я использовать здесь «String» или «Button»?
Обычно мы передаемсписок данных для класса адаптера, и этот список будет использоваться для заполнения данных в представлениях RecyclerView (поэтому мы никогда не будем передавать кнопки или что-либо подобное), а RecyclerView берет на себя ответственность за создание представлений для нас в зависимости от размера списка данных, который мыпередается в RecyclerView в CatAdapter
классе в:
override fun getItemCount( ): Int {
return catList.size
}
Теперь для каждой позиции RecyclerView будет создавать ViewHolder, который будет содержать наш Layout как View, и это то, что происходит в onCreateViewHolder
в CatAdapter
:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
//Inflating our layout (inflaing simple words, it's just a process to convert xml layout to View.
var v: View = LayoutInflater.from(context).inflate(R.layout.cat_unit, parent, false)
//Creating a ViewHolder that holds the view inside it.
return ViewHolder(v)
}
Последнее, onBindViewHolder
вызывается всякий раз, когда ViewHolder присоединяется к ReyclerView, и это подходящее место для привязки данных (заполняем наши представления данными) и установки щелчков «Прослушиватели» в представлениях (в вашем случае кнопки). Итак, как связать данные и setOnClickListener на этой кнопке? во-первых, взгляните onBindViewHolder()
:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
}
В параметрах:
holder: ViewHolder
, которые содержат наши представления, мы можем использовать его для привязки данных и прослушивателей щелчков. position: Int
текущего представления, мы будем использовать эту позицию для получения данных из нашего списка (в вашем случае catList
).
Теперь вы знаете, как использоватьonBindViewHolder
давайте напишем код (CatAdapter
class):
package org.mp.chiproject01.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.recyclerview.widget.RecyclerView
import org.mp.chiproject01.R
class CatAdapter(var catList: ArrayList<String>, var context: Context): RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
var v: View = LayoutInflater.from(context).inflate(R.layout.cat_unit, parent, false)
return ViewHolder(v)
}
override fun getItemCount( ): Int {
return catList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
//First, get data from catList by position.
val data = catList[position]
//Then, bind this data to the views (the button).
holder.catBtn.text = data
holder.catBtn.setOnClickListener {
//Do something when button clicked
}
}
}
class ViewHolder(view: View): RecyclerView.ViewHolder(view){
//catBtn should be val since it'll never change.
val catBtn = view.findViewById<Button>(R.id.cat_btn)
}
Примечание. Убедитесь, что вы присоединяете FragmentCategory
к своей деятельности и передаете данные в catList
в своемFragmentCategory
.