RecyclerViewAdapter-列表正在更新,但视图未

时间:2019-05-03 10:21:44

标签: android firebase-realtime-database kotlin android-tv

我制作了一个用于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}}。这是我测试中的一些注意事项:

  • Android TV具有某种奇怪的活动生命周期,因为它可以在移动设备上正常运行
  • 这不是与数据/方法有关的错误。它与视图或上下文有关。
  • 如上所述,这不是数据传递问题,因此在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)。

我知道这是一篇很长的文章,而且阅读很多,对此我感到很抱歉,但是您有什么想法我可以做些什么来解决?我一直在尝试解决第三天的问题,但我没有想到。

1 个答案:

答案 0 :(得分:0)

在您的onResume()方法中,执行notifyDataSetChanged(),因为您锁定了设备,所以当您返回设备时,它会触发onResume(),然后可以刷新视图。

enter image description here