数据未显示在回收站视图上
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) 上显示项目