RecyclerView 首次加载时不显示数据

Lan*_*ter 1 android kotlin android-recyclerview

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

视图.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" />
Run Code Online (Sandbox Code Playgroud)

这是我在片段中设置回收器视图的方法:

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

适配器:

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) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Lan*_*ter 5

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

  • 因为您的 HEIGHT 设置为 WRAP_CONTENT。 (5认同)