RecyclerView не отображает данные, но onBindViewHolder никогда не вызывался

#kotlin #android-recyclerview #android-adapter #android-viewholder

Вопрос:

Я использую recyclerView для отображения своих данных, но отображается все, что угодно. То onBindViewHolder никогда не называется и то onCreateViewHolder также. Я инициализирую адаптер в ViewModel с помощью данных, которые я получил из комнаты, но ничего не отображается. Данные в ViewModel есть, когда я хочу передать их адаптатору. Вот адаптатор,

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

Вот фрагмент,

 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
}


}
 

Комментарии:

1. вы установили LayoutManager в xml ? Не вижу, как ты это делаешь в коде

Ответ №1:

Пожалуйста, попробуйте приведенный ниже код, настроив менеджер компоновки перед назначением адаптера для RecyclerView

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

Комментарии:

1. Да, я это сделал, проблема заключалась в том, что я плохо инициализировал RecycleView в xml-файле.