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.AdapterFirebaseRecyclerAdapter 的唯一区别是,在前一个中显示旧列表,而在后一个中,视图引用正在丢失(?不是吗?)。

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

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

【问题讨论】:

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

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

【讨论】:

嘿!我刚刚更新了我的主要帖子。不幸的是,它并没有解决我的问题

以上是关于RecyclerView 适配器 - 列表正在更新,但视图没有的主要内容,如果未能解决你的问题,请参考以下文章

如何更新适配器数据列表?

我正在尝试使用 recyclerview 在屏幕上打印列表,但适配器部分中的代码不起作用

将对象列表从片段传递到 recyclerView 适配器

从RecyclerView适配器更新活动或片段的视图

两个 ArrayList 一个 RecyclerView 适配器

如何动态地将列表项添加到recyclerView?