我有一个回收站视图问题,数据未显示。 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_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".presentation.MainActivity">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/resultsRv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/song_item_margin"
android:textColor="@color/black" />
请发送帮助:(
编辑:添加 Xml 代码
答案 0 :(得分:0)
我相信您使用的范围函数是错误的,尤其是在这种情况下 run
。如果您需要计算某个值或想要限制多个局部变量的范围,请使用 run()
函数。
所以虽然你的其他代码看起来没问题,但我相信你的 Adapter 和 LayoutManager 没有被分配。我建议您将 run
替换为 apply
,然后重试。
resultsRv.apply {
adapter = releasesAdapter
layoutManager = LinearLayoutManager(this@MainActivity)
}