android - 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)
}
修复:
原来我没有把文本视图放在卡片视图中。我完全忘记了那一步,这是我的错误。希望这篇文章可以提醒其他人也填充他们的卡片视图并确保它被填满。这对我来说也是一个提醒。确实是非常愚蠢的错误,但现在我确定我不会重蹈覆辙。
非常感谢所有评论的人
解决方案
有一些修复:
- 你
getHouses
先打电话,然后观察数据。您应该在哪里观察数据,然后调用getHouses
. - 只设置
RecyclerView
slayoutManager
和setHasFixedSize
一次。 rv.adapter = it.adapter
由于这一行,删除 这似乎是多余的:it.adapter = HousesAdapter(houses, this)
.- 这条线似乎有点多
rv = view?.findViewById(R.id.rvHouses) ?: return
,所以如果view
我们返回,有些东西告诉我这绝不应该是这样RecyclerView
。null
这是一个示例,其中包含我建议的所有更改:
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()
你的
onBindViewHolder
方法似乎很可疑,看看你应该有类似的例子:override fun onBindViewHolder(holder: BindingHolder, position: Int) { item: T = items.get(position) holder.binding.setVariable(BR.item, item); holder.binding.executePendingBindings(); }
推荐阅读
- java - 找不到路径 PostgreSQLContainer testContainers
- spring - 在 SpringBoot 中测试 RestTemplate
- android - android 您不能将自定义标题与其他标题功能结合使用
- html - 如何在导航菜单中的 CSS 中解决这些问题?
- less - LESS 中的媒体查询和 if else 语句
- github - 您可以自定义贡献者在您的 Github 项目问题选项卡上看到的内容吗?
- javascript - 将对象添加到特定的 json PHP 数组
- android - 从 sqlite 数据库中删除表中的整行
- android - 当 taskAffinity 活动正在调用 finish() 但它不会关闭最近的应用程序
- azure - 对 ASP.NET Web API 的 Azure 静态网站身份验证