【问题标题】:RecyclerView not showing data on first loadRecyclerView 在第一次加载时不显示数据
【发布时间】:2022-02-07 10:11:22
【问题描述】:

我正在尝试使用 LiveData 从本地数据库加载数据列表。

view.xml

... // constraint layout surrounds this
<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView_cities"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp" />

这是我在 Fragment 中设置回收站视图的方式:

val citiesAdapter = CitiesAdapter(cityRepository)
with(view.recyclerView_cities) {
    layoutManager = LinearLayoutManager(activity)
    setHasFixedSize(true)
    adapter = citiesAdapter
}
cityRepository.getAllCities().observe(this, Observer { list ->
    citiesAdapter.submitList(list)
})

适配器:

class CitiesAdapter(private val repository: CityRepository) : ListAdapter<City, CitiesAdapter.CardViewHolder>(CityCallback()) {
    class CityCallback: DiffUtil.ItemCallback<City>() {
        override fun areItemsTheSame(oldItem: City, newItem: City): Boolean {
            return oldItem.city == newItem.city && oldItem.stateId == newItem.stateId
        }

        override fun areContentsTheSame(oldItem: City, newItem: City): Boolean {
            return oldItem.city == newItem.city &&
                    oldItem.stateName == newItem.stateName &&
                    oldItem.stateId == newItem.stateId &&
                    oldItem.selected == newItem.selected
        }
    }

    fun getCityAt(position: Int): City = getItem(position)

    // Provide a reference to the views for each data item
    class CardViewHolder(cardView: CardView) : RecyclerView.ViewHolder(cardView) {
        lateinit var checkBox: CheckBox
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
        ...
    }

    override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
        ...
    }
}

cityRepository.getAllCities() 从我的数据库中返回一个 LiveData>。

我正在使用从 RecyclerView 扩展而来的 ListAdapter,以便它可以为我管理列表。此外,我正在使用 DiffUtil,以便调用更精细的通知,而不仅仅是使用 notifyDataSetChanged。

预期行为: 当我加载片段时,RecyclerView 中会显示一个列表,其中包含数据库中的所有城市。

实际行为: 当我加载片段时,即使数据库中有城市,也会显示一个空列表。如果我从片段中添加一个新城市,列表中会填充之前的所有内容以及新添加的项目。

编辑: 我在 xml 中插入了一个 EditText,当我从模拟器中单击它时,列表就会填充。当我尝试以编程方式单击它时它不起作用。

【问题讨论】:

  • 您能否说明如何填充LiveData 以及citiesAdapter.submitList 是什么?我猜一些填充动作不会通知观察者。
  • livedata 由来自我的 DAO 的 Room 查询填充。 submitList 是ListAdapter&lt;T, VH&gt; 的库函数,所以我无法控制它。
  • 你在适配器的构造函数中添加了super(User.DIFF_CALLBACK);吗?

标签: android kotlin android-recyclerview


【解决方案1】:

我删除了setHasFixedSize(true) 并按预期加载了数据。谁能解释一下为什么会解决它?

【讨论】:

【解决方案2】:

你需要在生命周期中附加一个观察者

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this, getViewModelFactory()).get(getModelClass())
        attachObservers()
    }

【讨论】:

    【解决方案3】:

    你有两个选择来解决这个问题。

    首先,您可以将 Fixed Size 设置为 false。

    recyclerView_cities.setHasFixedSize(false)
    

    其次,您可以在 XML 文件中将 RecyclerView 的最小高度设置为您喜欢的大小。

    android:minHeight="300dp"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多