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

时间:2021-06-08 12:38:23

标签: android android-recyclerview adapter notifydatasetchanged

我有一个回收站视图问题,数据未显示。 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 代码

1 个答案:

答案 0 :(得分:0)

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

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

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