【问题标题】:RecyclerViewAdapter - list is being updated, but view is notRecyclerView 适配器 - 列表正在更新,但视图没有
【发布时间】: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.AdapterFirebaseRecyclerAdapter 的唯一区别是,在前一个中显示旧列表,而在后一个中,视图引用正在丢失(?不是吗?)。

最后:有趣的是。这并非在所有移动设备上都能正常工作,即使在相同的 Android 版本上也能正常工作。该错误发生在真正的 Android TV 和 Android TV 模拟器(一个带有 Google API)上。

我知道这是一篇很长的帖子,需要阅读很多内容,对此我深表歉意,但您有什么想法可以做些什么来解决它吗?第三天我一直在努力解决这个问题,但我什么也没想到。

【问题讨论】:

  • 如何使用 firestore 回收器视图,它会在添加新条目时自动更新视图
  • @Mr.Patel 我还没有在这个项目上尝试过,但我想知道我可以在哪里完成这个代码,因为本地数据库也可能发生这种情况。跨度>
  • 你为什么不使用onResume方法?
  • 请检查我的回答,如果问题仍未解决,我强烈建议您使用 Firestore 回收站视图。
  • 任何错误日志?

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


【解决方案1】:

在你的onResume()方法中,做一个notifyDataSetChanged(),因为你锁定了设备,当你回到它时,它应该触发onResume()然后,你可以刷新你的视图。

【讨论】:

  • 嘿!我刚刚更新了我的主要帖子。不幸的是,它并没有解决我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多