数据未显示在回收站视图上

Posted

技术标签:

【中文标题】数据未显示在回收站视图上【英文标题】:Data not displayed on recycler view 【发布时间】:2021-08-25 10:52:36 【问题描述】:

我遇到了未显示数据的回收站视图问题。 onCreateViewHolder 和 onBindViewHolder 没有被调用。当我调用 notifyDataSetChanged() 时,会调用 notifyChanged() 但 mObservers 是空的,所以它不会更新我的列表。

public void notifyChanged() 
        
        for (int i = mObservers.size() - 1; i >= 0; i--) 
            mObservers.get(i).onChanged();
        

这是我的适配器代码:

class ReleasesAdapter : RecyclerView.Adapter<ReleasesAdapter.ReleasesViewHolder>() 

    private val data = mutableListOf<Album>(Album())

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReleasesViewHolder 
        return ReleasesViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(R.layout.song_item, parent, false)
        )
    

    override fun onBindViewHolder(holder: ReleasesViewHolder, position: Int) 
       holder.bindView(data[position])
    

    override fun getItemCount(): Int 
        return data.size
    

    fun setItems(items: List<Album>) 
        data.addAll(items)
        notifyDataSetChanged()
    

    inner class ReleasesViewHolder(
        override val containerView: View
    ) : RecyclerView.ViewHolder(containerView), LayoutContainer 

        fun bindView(item: Album) 
           containerView.nameTv.text = item.name
        
    

这是我的活动代码:

@androidEntryPoint
class MainActivity : AppCompatActivity(), Contract.View 

@Inject
lateinit var presenter: Contract.Presenter

private val releasesAdapter = ReleasesAdapter()

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    resultsRv.run 
        adapter = releasesAdapter
        layoutManager = LinearLayoutManager(this@MainActivity)
    

    presenter.loadNewReleases()


override fun showReleases(data: List<Album>) 
    releasesAdapter.setItems(data)


override fun showErrorMessage(message: String) 



activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context=".presentation.MainActivity">

    <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/resultsRv"
        android:layout_
        android:layout_
        tools:listitem="@layout/song_item" />

</androidx.appcompat.widget.LinearLayoutCompat>

song_item.xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.textview.MaterialTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/nameTv"
    android:layout_
    android:layout_
    android:layout_margin="@dimen/song_item_margin"
    android:textColor="@color/black" />

请发送帮助:(

编辑:添加 Xml 代码

【问题讨论】:

【参考方案1】:

我相信您在这种情况下使用了错误的范围函数,尤其是run。如果您需要计算某个值或想要限制多个局部变量的范围,请使用run() 函数。

因此,虽然您的其他代码看起来不错,但我相信您的 Adapter 和 LayoutManager 没有被分配。我建议您将run 替换为apply,然后重试。

resultsRv.apply 
        adapter = releasesAdapter
        layoutManager = LinearLayoutManager(this@MainActivity)
    

【讨论】:

apply 在这种情况下更好,但这不是问题。改变了,仍然存在。 @marcia 你能粘贴你的 XML 代码吗?正如我所说的那样,代码没有任何问题。更好地对其进行一些调试,尝试发送一些虚拟数据,看看是否出现? @marcia 您的 XML 也很好。尝试加载一些虚拟数据。只是您的Album 类的一些虚拟对象,并使用该虚拟数据调用releaseAdapter.setItem()。我相信我们可能需要逐步调试它。 在 onCreate 中添加了一个虚拟列表,它可以工作。但是,如果我将此代码 gist.github.com/marcia-rocha/cb7712e108ac6cb4f7229ddd44746920 移动到 showReleases 内部,我会得到 NPE gist.github.com/marcia-rocha/7c143408a1646a88ae7c70d4851abf27 @marcia 我刚刚检查了你的要点。我们遇到了context 的问题。从虚拟数据中可以看出,我们的recyclerView 没有问题。您可能想接下来检查您的 Presenter 逻辑,特别是查看此错误 Context.getApplicationInfo() on a null 中指出的 Context 是什么@

以上是关于数据未显示在回收站视图上的主要内容,如果未能解决你的问题,请参考以下文章

导航后未附加回收站视图

数据未显示在回收站视图中

回收站视图未显示在片段中

回收站视图未在 Fragment (Android) 上显示项目

回收站视图未在 android studio 中显示一张卡片视图

使用 firebase 未显示回收站视图 - kotlin