NotifyDataSetChanged и toMutableList не работают (Kotlin)

Я получаю данные из 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()
       }
   }
}
0
0
310
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле вы не меняете данные в адаптере. Вы передаете ссылку на tvShowsArrayList при создании адаптера, поэтому, если вы измените содержимое этого списка, адаптер сможет его увидеть. Но когда вы делаете

tvShows.toMutableList().addAll(mostPopularTVShowsResponse.tvShows)

вы создаете новый отдельный список, вызывая toMutableList, и добавляете в него что-то. tvShows по-прежнему оригинальный, неизменный ArrayList, в котором ничего нет.

Если вы собираетесь сделать это таким образом, вам нужно сделать список изменяемым с самого начала.

val tvShows = mutableListOf<TVShow>()

то вы можете clear и add к нему, когда вы получите новые данные.

Однако, как правило, лучше дать адаптеру какую-то функцию setData, где вы передаете список, чтобы он мог обновлять свой собственный внутренний набор данных и уведомлять себя об изменении. Таким образом, адаптер сам управляет своим состоянием, все, что вам нужно сделать, это передать ему некоторые новые данные.

: 0 это правда, я думал, что это было равносильно только вызову функции toMutableList, и теперь конов, потому что я действительно был сбит с толку, большое спасибо

Andres 23.12.2020 01:02

Другие вопросы по теме