I have a use case...
I want to get layoutInflator
to bind different Views for nested recyclerView. Is there any best way to get layoutInflator
?
I was trying to get it from onBindViewHolder
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder. //something?
}
CodePudding user response:
You shouldn't be inflating anything in onBindViewHolder
- onCreateViewHolder
is where you set up a ViewHolder
object that displays a list item, including inflating its layout views. onBindViewHolder
is where you interact with those views, to display the appropriate data for the current item.
Those created ViewHolder
s get reused, so instead of inflating views for every item, you just create a handful of ViewHolder
s that get swapped around as you scroll the list. That recycling of a pool of VHs is why it's called a RecyclerView
.
Generally, you'd store references to the inflated views inside each ViewHolder
, like in this example:
/**
* Provide a reference to the type of views that you are using
* (custom ViewHolder)
*/
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val textView: TextView
init {
// Define click listener for the ViewHolder's View
textView = view.findViewById(R.id.textView)
}
}
That way, the ViewHolder
that gets passed into onBindViewHolder
has a textView
field you can access, e.g. to set its text contents to display data for the current item. (If you're using View Binding, you could store a reference to the binding object instead, and access the views through holder.binding.textView
etc)
I don't know what you're doing with nested RecyclerView
s, but the principle is the same - each ViewHolder
in the main RV will contain another RV, with its own adapter and data set, created and initialised in onCreateViewHolder
. If you want to change its contents (because you're displaying a particular item in the main RV list) you'd probably want to add a setData
function on the nested RV's adapter that changes its data set and refreshes the display. Let the adapter handle inflating things when it needs to, inside onCreateViewHolder
CodePudding user response:
You can keep the reference in a ViewHolder
class ViewHolder(view: View, val layoutInflater: LayoutInflater) : RecyclerView.ViewHolder(view) {
}
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val layoutInflator = LayoutInflater.from(viewGroup.context)
val view = layoutInflator
.inflate(R.layout.text_row_item, viewGroup, false)
return ViewHolder(view, layoutInflator)
}
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
//viewHolder.layoutInflator
}