【问题标题】:notifyDataSetChanged and toMutableList don 't Works (Kotlin)notifyDataSetChanged 和 toMutableList 不起作用 (Kotlin)
【发布时间】:2020-12-22 19:08:09
【问题描述】:

我从 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 insted 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()
       }
   }
}

【问题讨论】:

    标签: android kotlin data-binding


    【解决方案1】:

    您实际上并没有更改适配器中的数据。您在创建适配器时传递了对 tvShows ArrayList 的引用,因此如果您更改了该列表的内容,适配器将能够看到它。但是当你这样做时

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

    您正在通过调用toMutableList 创建一个新的单独列表,并且您正在向那个添加内容。 tvShows 仍然是原始的、不可变的 ArrayList,其中没有任何内容。

    如果你打算这样做,你需要让列表从一开始就可变

    val tvShows = mutableListOf<TVShow>()
    

    然后你可以clearadd 来获取新数据。

    一般来说,一个更好的主意是给适配器某种setData 函数,您可以在其中传递一个列表,以便它可以更新自己的内部数据集并通知自己有关更改。通过这种方式适配器管理它自己的状态,您的所有活动或片段需要做的就是传递一些新数据

    【讨论】:

    • :0 是真的,我相信那是平等的,只调用函数 toMutableList 现在知道了,因为我真的是 confuce ,非常感谢
    猜你喜欢
    • 2019-05-23
    • 2021-07-05
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多