我正在尝试使用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,当我从仿真器中单击它时,该列表就会出现。当我尝试以编程方式单击它时,它不起作用。
答案 0 :(得分:1)
您需要在生命周期中附加一名观察员
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this, getViewModelFactory()).get(getModelClass())
attachObservers()
}
答案 1 :(得分:0)
我删除了setHasFixedSize(true)
,并按预期加载了数据。谁能解释为什么能解决这个问题?