Я получаю данные из API http и использую dataBinding и viewModel, все работает, но когда я пытаюсь преобразовать свой список в mutableList и добавить All, ничего не получаю, также попробуйте передать данные простым способом и работать, данные будут там проблема в том, что notifyDataSetChanged() не вносит изменений в мой адаптер, и я ничего не вижу в recyclerView.
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MostPopularTVShowsViewModel
private lateinit var activityMainBinding : ActivityMainBinding
private var tvShows: List<TVShow> = ArrayList()
private lateinit var tvShowAdapter:TVShowsAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)
doInitialization()
}
private fun doInitialization(){
activityMainBinding.tvShowRecycleView.setHasFixedSize(true)
viewModel= ViewModelProvider(this).get(MostPopularTVShowsViewModel::class.java)
tvShowAdapter= TVShowsAdapter(tvShows)
activityMainBinding.tvShowRecycleView.adapter=tvShowAdapter
getMostPopularTVShows()
}
private fun getMostPopularTVShows(){
activityMainBinding.isLoading=true
viewModel.getMostPopularTVShows(0).observe(this, { mostPopularTVShowsResponse ->
activityMainBinding.isLoading=false
if (mostPopularTVShowsResponse != null){
tvShows.toMutableList().addAll(mostPopularTVShowsResponse.tvShows)
//tvShows=mostPopularTVShowsResponse.tvShows
println("size is: "+tvShows.size)
tvShowAdapter.notifyDataSetChanged()
}else{
Toast.makeText(this," NULL", Toast.LENGTH_SHORT).show()
}
})
}
}
когда я меняю tvShows=mostPopularTVShowsResponse.tvShows
вставлен tvShows.toMutableList().addAll(mostPopularTVShowsResponse.tvShows)
список получает данные, но notifyDataSetChanged не работает
это мой адаптер
class TVShowsAdapter(private val items: List<TVShow>): RecyclerView.Adapter<TVShowsAdapter.ViewHolder>(){
private lateinit var layoutInflater: LayoutInflater
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
layoutInflater= LayoutInflater.from(parent.context)
val binding: ItemContainerTvShowBinding = DataBindingUtil.inflate(
layoutInflater, R.layout.item_container_tv_show,parent,false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int)= holder.bind(items[position])
override fun getItemCount()= items.size
class ViewHolder(private val itemContainerTvShowBinding: ItemContainerTvShowBinding):
RecyclerView.ViewHolder(itemContainerTvShowBinding.root){
fun bind (tvShow: TVShow){
itemContainerTvShowBinding.tvShow=tvShow
itemContainerTvShowBinding.executePendingBindings()
}
}
}
На самом деле вы не меняете данные в адаптере. Вы передаете ссылку на tvShows
ArrayList
при создании адаптера, поэтому, если вы измените содержимое этого списка, адаптер сможет его увидеть. Но когда вы делаете
tvShows.toMutableList().addAll(mostPopularTVShowsResponse.tvShows)
вы создаете новый отдельный список, вызывая toMutableList
, и добавляете в него что-то. tvShows
по-прежнему оригинальный, неизменный ArrayList
, в котором ничего нет.
Если вы собираетесь сделать это таким образом, вам нужно сделать список изменяемым с самого начала.
val tvShows = mutableListOf<TVShow>()
то вы можете clear
и add
к нему, когда вы получите новые данные.
Однако, как правило, лучше дать адаптеру какую-то функцию setData
, где вы передаете список, чтобы он мог обновлять свой собственный внутренний набор данных и уведомлять себя об изменении. Таким образом, адаптер сам управляет своим состоянием, все, что вам нужно сделать, это передать ему некоторые новые данные.
: 0 это правда, я думал, что это было равносильно только вызову функции toMutableList, и теперь конов, потому что я действительно был сбит с толку, большое спасибо