我在这里演示我的问题
首先,我的应用程序使用MVVM体系结构。 我有一个存储库,可从Firebase存储中获取所有列表文件
fun getRestItem(type : String) : LiveData<ArrayList<eachItem>> {
val list = ArrayList<eachItem>()
val listStream = MutableLiveData<ArrayList<eachItem>>()
storage.child(type).listAll().addOnSuccessListener {
it.items.forEach { item ->
item.downloadUrl.addOnSuccessListener { url ->
val eachItem = eachItem(url.toString())
list.add(eachItem)
listStream.value = list
}
}
}
return listStream
}
使用viewmodel获取数据
fun getItem() : LiveData<ArrayList<eachItem>> {
return drawRepository.getRestItem("Item")
}
最后,UI会观察数据
model.getItem().observe(viewLifecycleOwner, Observer {
if (it != null) {
val adapter = ItemAdapter()
adapter.submitList(it)
binding.doilyRecycler.adapter = adapter
}
})
我的适配器正在使用ListAdapter类。
问题在于,当我们获取数据时,recyclerview(UI)会回到顶部,并且无法向下滚动,即使我强制向下滚动,该视图也会一直回到顶部,直到存储中的所有数据已被提取。 我真的不知道这里的问题,我已经使用listAdapter了很多次,而且之前也没有遇到过这样的问题(也许是因为Firebase存储(我获取数据的方式)?)。我看到的滚动条正在改变,而数据大小越来越大
我猜想新数据即将来临时,recycerview会不断刷新...
你们能给我这么建议吗?
***编辑(显示我的recyclerview xml
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/doilyRecycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:spanCount="3"
android:clipToPadding="false"
tools:listitem="@layout/each_item"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager">
</androidx.recyclerview.widget.RecyclerView>
答案 0 :(得分:1)
您可以尝试使用测试列表数据,而不是使用Firebase存储,如果问题仍然存在,请说明Firebase存储是否有效
答案 1 :(得分:0)
我只是简单地通过将recyclerview包装到nestScrollview来解决此问题,但它确实有效(但是在同时滚动并获取数据时确实滞后,这是不可接受的)。 我真的不知道为什么在这种情况下为什么recyclerview滚动行为如此。