【发布时间】: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 回收站视图。
-
任何错误日志?
标签: android firebase-realtime-database kotlin android-tv