我制作了一个用于Android TV的应用,该应用显示了Firebase中的项目列表。
预期行为:
完成对数据库的任何更改后,获取数据库并更新视图。
怎么了?
直到我锁定设备之前,数据均已正确获取并显示。之后,它立即停止刷新视图,仅仅。我在适配器类中放置了一些“ 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()
中设置了布局管理器。
编辑:在阅读了几篇文章并关注“查看”旁边的粗体字“仅”之后,它引导我在移动设备上调试了该应用,并使用{ {1}}。这是我测试中的一些注意事项:
FirebaseUI
中调用NotifyDataSetChanged()
不能解决问题,因为这是与视图有关的问题。 在Android TV上具有FirebaseRecyclerAdapter的行为:
只要设备未锁定,应用程序即可正常运行。锁定和解锁设备后,将清除RecyclerView,即使日志显示仍可以正确提取数据并应显示。
所以,在我看来,设备重新锁定后,适配器失去了其视图引用,这是我的onResume()
代码,类似于Kotlin类:
onCreateViewHolder()
在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);
}
中创建适配器的新实例(是的,我知道我们不应该这样做),将上下文传递给适配器?没有任何帮助,RecyclerView仍然保持空白。
因此,再次扩展onResume()
和RecyclerView.Adapter
的唯一区别是,在前一个列表中显示的是旧列表,而在后一个视图中的引用丢失了(不是吗? )。
最后:这是有趣的事情。此功能不适用于所有移动设备,即使是在同一Android版本上也是如此。该错误同时出现在实际的Android TV和Android TV模拟器上(一个带有Google API)。
我知道这是一篇很长的文章,而且阅读很多,对此我感到很抱歉,但是您有什么想法我可以做些什么来解决?我一直在尝试解决第三天的问题,但我没有想到。