RecyclerView在第一次加载时不显示数据

时间:2019-01-10 17:14:06

标签: android kotlin android-recyclerview

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

view.xml

private static final boolean offline = false;
public static String mbTilesString = "/Users/roy/IdeaProjects/UnfoldingMaps/data/blankLight-1-3.mbtiles"
private UnfoldingMap map;

public void setup() {
    size(900, 700, OPENGL);

    if (offline) {
        this.map = new UnfoldingMap(this, 200, 50, 650, 600, new MBTilesMapProvider(mbTilesString));
    } else {
        this.map = new UnfoldingMap(this, 200, 50, 650, 600, new Microsoft.RoadProvider());
    }

    MapUtils.createDefaultEventDispatcher(this, this.map);

    noLoop(); // draw() gets called only once
}

public void draw() {
    this.map.draw();
}

这是我在“片段”中设置回收站视图的方式:

... // 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" />

适配器:

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) { ... } } 从我的数据库返回一个LiveData>。

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

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

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

编辑: 我在EditText中入侵了xml,当我从仿真器中单击它时,该列表就会出现。当我尝试以编程方式单击它时,它不起作用。

2 个答案:

答案 0 :(得分:1)

您需要在生命周期中附加一名观察员

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

答案 1 :(得分:0)

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