RecyclerView 适配器 - 列表正在更新,但视图没有
Posted
技术标签:
【中文标题】RecyclerView 适配器 - 列表正在更新,但视图没有【英文标题】:RecyclerViewAdapter - list is being updated, but view is not 【发布时间】:2019-09-21 21:14:28 【问题描述】:我为 android TV 制作了一个应用,它显示 Firebase 中的项目列表。
预期行为: 对数据库进行任何更改后,获取数据库并更新视图。
怎么了? 直到我锁定设备的那一刻,数据都被正确获取和显示。之后它会立即停止刷新视图only。我在我的适配器类中放了一些“Log.d”来打印更新的列表,并且列表会按原样更新。因此,总而言之,数据被正确获取,列表正在更新,但视图没有(在设备锁定处于活动状态之前它仍然像列表一样)。
代码: 从后端回调并更改列表:
override fun onDataSetChanged(prepareList: List<Long>)
mPrepareAdapter.setOnDataSetChanged(prepareList)
适配器:
var prepareList: MutableList<Long> = ArrayList()
...
fun setOnDataSetChanged(list: List<Long>)
prepareList.clear()
prepareList.addAll(list)
this.notifyDataSetChanged()
Log.d("prepareListAdapter", prepareList.toString())
注意:我没有发布像 onResume()
这样的生命周期方法,因为它们可以正常工作。话虽如此,他们只应该删除数据观察者或添加它们以观察数据库更改。如上所述,即使在设备被锁定和解锁之后,数据也始终正确获取,但只是视图没有被更新。
另外,在设置适配器之前,我已经在onCreate()
中设置了布局管理器。
编辑:在阅读这篇文章几次并关注“视图”旁边的粗体字“仅”之后,它引导我在移动设备上调试这个应用程序并使用 @ 创建第二个适配器987654325@。以下是我的测试中的一些笔记:
Android TV 具有某种奇怪的 Activity 生命周期,因为它可以在移动设备上正常运行 这不是数据/方法相关的错误。它与视图或上下文相关。 如上所述,这不是数据传输问题,因此在onResume()
中调用 NotifyDataSetChanged()
并不能解决问题,因为它是 (?) 与视图相关的问题。
Android TV 上 FirebaseRecyclerAdapter 的行为: 只要设备未锁定,应用程序就可以正常工作。在设备被锁定和解锁后,RecyclerView 正在被清除,即使日志显示数据仍然被正确获取并且应该被显示。
所以,在我看来,在设备重新锁定后,适配器失去了它的视图引用,这是我的 onCreateViewHolder()
代码,类比在 Kotlin 类中:
private LayoutInflater inflater;
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)
if (inflater == null)
Context context = viewGroup.getContext();
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.item_textview_prepare, viewGroup, false);
return new ViewHolder(view);
在onResume()
中创建适配器的新实例(是的,我们不应该这样做,我知道),将上下文传递给适配器?没有任何帮助,RecyclerView 仍然保持空白。
因此,与扩展 RecyclerView.Adapter
和 FirebaseRecyclerAdapter
的唯一区别是,在前一个中显示旧列表,而在后一个中,视图引用正在丢失(?不是吗?)。
最后:有趣的是。这并非在所有移动设备上都能正常工作,即使在相同的 Android 版本上也能正常工作。该错误发生在真正的 Android TV 和 Android TV 模拟器(一个带有 Google API)上。
我知道这是一篇很长的帖子,需要阅读很多内容,对此我深表歉意,但您有什么想法可以做些什么来解决它吗?第三天我一直在努力解决这个问题,但我什么也没想到。
【问题讨论】:
如何使用 firestore 回收器视图,它会在添加新条目时自动更新视图 @Mr.Patel 我还没有在这个项目上尝试过,但我想知道我可以在哪里完成这个代码,因为本地数据库也可能发生这种情况。跨度> 你为什么不使用onResume方法? 请检查我的回答,如果问题仍未解决,我强烈建议您使用 Firestore 回收站视图。 任何错误日志? 【参考方案1】:在你的onResume()
方法中,做一个notifyDataSetChanged()
,因为你锁定了设备,当你回到它时,它应该触发onResume()
然后,你可以刷新你的视图。
【讨论】:
嘿!我刚刚更新了我的主要帖子。不幸的是,它并没有解决我的问题以上是关于RecyclerView 适配器 - 列表正在更新,但视图没有的主要内容,如果未能解决你的问题,请参考以下文章
我正在尝试使用 recyclerview 在屏幕上打印列表,但适配器部分中的代码不起作用