首页 > 解决方案 > Android - 我的 recyclerview 没有显示数据

问题描述

我是这里的初级程序员,尝试使用 Kotlin 在 Android 中创建 MVVM 应用程序。我正在尝试创建一个房屋应用程序,该应用程序从 API 检索房屋,然后在回收站视图中显示它们。

问题是我的回收站视图是空的。我确实有一个适配器,也许出了点问题。我相信他们没有正确配对

无论如何,我要展示我的片段类。

class HousesFragment : Fragment() {

private lateinit var factory: HousesViewModelFactory
private lateinit var viewModel: HousesViewModel
private lateinit var rv: RecyclerView
private lateinit var adapter: HousesAdapter


override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.houses_fragment, container, false)
}


override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    val api = HouseApi()
    val repo = HouseRepo(api)
    factory = HousesViewModelFactory(repo)
    viewModel = ViewModelProviders.of(this, factory).get(HousesViewModel::class.java)
    rv = view?.findViewById(R.id.rvHouses) ?: return

    //use the adapter
    viewModel.getHouses()
    viewModel.houses.observe(viewLifecycleOwner, Observer { houses ->
        rv.also {

            it.layoutManager = LinearLayoutManager(requireContext())
            it.adapter = HousesAdapter(houses, this)
            it.setHasFixedSize(true)

            rv.adapter = it.adapter


        }
    })


}

}

我认为这段代码尤其是导致问题的原因

rv.also {

            it.layoutManager = LinearLayoutManager(requireContext())
            it.adapter = HousesAdapter(houses, this)
            it.setHasFixedSize(true)

            rv.adapter = it.adapter


        }

我之所以这么说是因为这段代码负责将recyclerview与适配器进行匹配。

我将解释我尝试过的其他事情。我试图实现其他人的代码,看看他们是如何工作的。我通过访问 Youtube 并查看了一堆教程来做到这一点。到目前为止没有任何效果,这样做并不理想。我正在尽力克服这个错误。看例子是我能做的最好的。我是一名初级程序员,还不具备自己调试所有内容的技能

谢谢

编辑:

这是适配器:

class HousesAdapter(
    private val houses: List<HouseItem>,
    housesFragment: HousesFragment
) : RecyclerView.Adapter<HousesAdapter.HousesViewHolder>() {

    override fun getItemCount() = houses.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
        HousesViewHolder(
            DataBindingUtil.inflate(
                LayoutInflater.from(parent.context),
                R.layout.recyclerview_house,
                parent,
                false
            )
        )

    override fun onBindViewHolder(holder: HousesViewHolder, position: Int) {
        holder.recyclerviewHouseBinding.house = houses[position]
    }

    inner class HousesViewHolder(

        val recyclerviewHouseBinding: RecyclerviewHouseBinding

    ) : RecyclerView.ViewHolder(recyclerviewHouseBinding.root)
}

在此处输入图像描述

在此处输入图像描述

修复:

原来我没有把文本视图放在卡片视图中。我完全忘记了那一步,这是我的错误。希望这篇文章可以提醒其他人也填充他们的卡片视图并确保它被填满。这对我来说也是一个提醒。确实是非常愚蠢的错误,但现在我确定我不会重蹈覆辙。

非常感谢所有评论的人

标签: androidandroid-recyclerview

解决方案


有一些修复:

  1. getHouses先打电话,然后观察数据。您应该在哪里观察数据,然后调用getHouses.
  2. 只设置RecyclerViewslayoutManagersetHasFixedSize一次。
  3. rv.adapter = it.adapter由于这一行,删除 这似乎是多余的: it.adapter = HousesAdapter(houses, this).
  4. 这条线似乎有点多rv = view?.findViewById(R.id.rvHouses) ?: return,所以如果view我们返回,有些东西告诉我这绝不应该是这样RecyclerViewnull

这是一个示例,其中包含我建议的所有更改:

    rv = view!!.findViewById(R.id.rvHouses)
    rv.layoutManager = LinearLayoutManager(requireContext())
    rv.setHasFixedSize(true)
    viewModel.houses.observe(viewLifecycleOwner, Observer { houses ->
        rv.adapter = HousesAdapter(houses, this)
    })
    viewModel.getHouses()
  1. 你的onBindViewHolder方法似乎很可疑,看看你应该有类似的例子:

     override fun onBindViewHolder(holder: BindingHolder, position: Int) {
         item: T = items.get(position)       
         holder.binding.setVariable(BR.item, item);            
         holder.binding.executePendingBindings();
     }
    

推荐阅读