Pablo Nahuel Carrizo
Pablo Nahuel Carrizo

Reputation: 33

lateinit property adapter has not been initialized setting up RecyclerView with Fragment

I have a problem adapting a RecyclerView to a fragment. I have a Navigation Drawer, which in turn has a TabLayout, and when I click on a Tab it takes me to this RecyclerView. I have no way to adapt it, now I get the error of "lateinit property adapter has not been initialized", but I tried a thousand different ways.

MainAdapter.kt

class MainAdapter(private val context: Context) : RecyclerView.Adapter<MainAdapter.MainViewHolder>() 
{

private var dataList = mutableListOf<Usuario>()

fun setListData(data:MutableList<Usuario>){
    dataList = data
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainViewHolder {
    val view = LayoutInflater.from(context).inflate(R.layout.item_row, parent, false)
    return MainViewHolder(view)
}

override fun getItemCount(): Int {
    return if(dataList.size > 0){
        dataList.size
    }else{
        0
    }
}

override fun onBindViewHolder(holder: MainViewHolder, position: Int) {
    val user = dataList[position]
    holder.bindView(user)
}

inner class MainViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){

    fun bindView(user: Usuario){
        Glide.with(context).load(user.imageUrl).into(itemView.circleImageView)
        itemView.txt_title.text = user.nombre
        itemView.txt_desc.text = user.descripcion 
    }

}
}

FragmentNotification.kt

class NotificacionesFragment : Fragment(){

private lateinit var adapter: MainAdapter
private lateinit var _view: View
private lateinit var rv: RecyclerView


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _view = inflater.inflate(R.layout.notificaciones, container, false)
   // val viewPager = x.findViewById<View>(R.id.viewPager) as ViewPager
    rv = _view.findViewById(R.id.rv) as RecyclerView

    rv.adapter = MainAdapter (requireContext())

    _view.rv.layoutManager = LinearLayoutManager(requireContext())
    _view.rv.adapter = adapter

    val dummyList = mutableListOf<Usuario>()
    dummyList.add(Usuario("lala","lala","lala"))

    adapter.setListData(dummyList)
    adapter.notifyDataSetChanged()

    return _view
}
}

Upvotes: 2

Views: 3201

Answers (2)

Chirag Rami
Chirag Rami

Reputation: 26

class NotificacionesFragment : Fragment(){

private lateinit var adapter: MainAdapter
private lateinit var _view: View
private lateinit var rv: RecyclerView


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _view = inflater.inflate(R.layout.notificaciones, container, false)
   // val viewPager = x.findViewById<View>(R.id.viewPager) as ViewPager
    rv = _view.findViewById(R.id.rv) as RecyclerView

    adapter = MainAdapter (requireContext())

    _view.rv.layoutManager = LinearLayoutManager(requireContext())
    _view.rv.adapter = adapter

    val dummyList = mutableListOf<Usuario>()
    dummyList.add(Usuario("lala","lala","lala"))

    adapter.setListData(dummyList)
    adapter.notifyDataSetChanged()

    return _view
}
}

Upvotes: 0

Ryan M
Ryan M

Reputation: 20119

The error is clear:

lateinit property adapter has not been initialized

You never set this property:

private lateinit var adapter: MainAdapter

You set rv.adapter, but never just adapter. You probably meant to do, instead:

adapter = MainAdapter (requireContext())
rv.adapter = adapter

Upvotes: 2

Related Questions