Ayman Mn
Ayman Mn

Reputation: 53

RecyclerView doesn't display data but onBindViewHolder never called

I'm using recyclerView to display my data but anything is displaying. The onBindViewHolder is never called and the onCreateViewHolder also. I initialize the adapter in the viewModel with the data which I got from room but anything is displaying. The data in the viewModel is there when I want give it to the adaptater. There's the adaptater,

class CountryInfoAdapter : RecyclerView.Adapter<TextItemViewHolder>() {

var data = listOf<DevByteCountryProperty>()
    set(value) {
        field = value
        notifyDataSetChanged()
    }


override fun getItemCount() = data.size

override fun onBindViewHolder(holder: TextItemViewHolder, position: Int) {
    val item = data[position]
    holder.textView.text = item.name.toString()
}


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TextItemViewHolder {
    //The inflater knows how to create views from XML layout. The context is the context of the RecyclerView.
    val layoutInflater = LayoutInflater.from(parent.context)

    val view = layoutInflater.inflate(R.layout.text_item_view, parent, false) as TextView

    Timber.i("Data from adaptater : ${data.toString()}")
    return TextItemViewHolder(view)
}
}

There is the Fragment,

class CountryInfoFragment : Fragment() {

private lateinit var viewModel: CountryInfoViewModel

private lateinit var viewModelFactory: CountryInfoViewModelFactory

private lateinit var binding: FragmentCountryInfoBinding


override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    binding =  DataBindingUtil.inflate(inflater,
        R.layout.fragment_country_info,container,false)


    val application = requireNotNull(this.activity).application

    viewModelFactory = CountryInfoViewModelFactory(application)

    viewModel = ViewModelProvider(this,viewModelFactory).get(CountryInfoViewModel::class.java)

    binding.viewModel = viewModel

    val adapter = CountryInfoAdapter()

    viewModel.countriesProperty.observe(viewLifecycleOwner, Observer {
        it?.let {
            adapter.data = it

        }
    })

    binding.countryList.adapter = adapter


    binding.lifecycleOwner = viewLifecycleOwner

    setHasOptionsMenu(true)
    return binding.root
}


}

Upvotes: 1

Views: 769

Answers (1)

Deep Patel
Deep Patel

Reputation: 2644

Please try below code, setting up layout manager before assigning adapter to recyclerView

    binding.countryList.layoutManager = LinearLayoutManager(this)
    binding.countryList.adapter = adapter

Upvotes: 1

Related Questions