提问人:Gregorio Scalbi 提问时间:5/30/2023 更新时间:5/30/2023 访问量:63
将 recyclerview 更改为 listview?
Change recyclerview for listview?
问:
我有一个来自数据库的响应,其中包含一个响应项列表,这些响应项包含 4 种不同类型的列表。我想做的是询问每个对象中包含什么类型的列表,并使用相应的列表膨胀视图。
我使用垂直回收器视图执行此操作,该视图包含其他水平回收器视图,具体取决于列表。我让它工作,但是在进行垂直滚动时,包含其他回收机的那个,它卡住了一点,运动不流畅,好像很难快速处理。
我的问题是,我不应该将该回收器视图更改为列表视图吗?加载需要更长的时间,但一切都已经加载完毕,滚动会更流畅。还是我错了? 每个列表的 RecyclerViews 的水平滚动运行流畅且没有问题。每个水平回收商清单有 10 个项目
这是我的家片段
class HomeFragment : Fragment(R.layout.fragment_home) {
private lateinit var binding: FragmentHomeBinding
private val viewModel by viewModels<CustomerViewModel> {
CustomerViewModelFactory(ApiCallsRepositoryImpl(DataSource(RetrofitClient.webservice)))
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentHomeBinding.bind(view)
viewModel.fetchDataInicio().observe(viewLifecycleOwner, Observer { result ->
when (result) {
is Resource.Loading -> {
Log.d("LiveDataFetchDataInicio", "Loading")
}
is Resource.Success -> {
LoadDataHome(result)
}
is Resource.Failure -> {
Log.d("ErrorFetchDataInicio", "${result.exception}")
}
}
})
}
private fun LoadDataHome(result: Resource.Success<HomeResponse>) {
Log.d("SuccessFetchDataInicio", "${result.data}")
val itemlist = mutableListOf<HomeResponseItem>()
itemlist.addAll(result.data)
val adapterPrincipal = HomeResponseAdapter(itemlist)
binding.rvPrincipal.layoutManager =
LinearLayoutManager(
binding.root.context,
LinearLayoutManager.VERTICAL,
false
)
binding.rvPrincipal.adapter = adapterPrincipal
adapterPrincipal.notifyDataSetChanged()
}
} 这是 RecyclerView 的适配器
class HomeResponseAdapter(private val itemList: List<HomeResponseItem>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
when (viewType) {
1 -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_pill_button_view, parent, false)
return PillButtonCarouselViewHolder(view)
}
2 ->{
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_card_product_view, parent, false)
return ProductsCarouselViewHolder(view)
}
3 -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_mini_banner_view, parent, false)
return MiniBannerCaruoselViewHolder(view)
}
4 ->{
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_square_banner_view, parent, false)
return SquareBannerCaruoselViewHolder(view)
}
else ->{
return EmptyViewHolder(View(parent.context))
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = itemList[position]
when (holder.itemViewType) {
1 -> {
val listaPillButton = item.contenido!!.pillButtons ?: listOf()
val tipo2ViewHolder = holder as PillButtonCarouselViewHolder
tipo2ViewHolder.bind(listaPillButton)
}
2 -> {
val listapProductsData = item.contenido!!.productos ?: listOf()
val tipo3ViewHolder = holder as ProductsCarouselViewHolder
tipo3ViewHolder.bind(listapProductsData)
}
3 -> {
val listaMiniBanner = item.contenido!!.miniBanners ?: listOf()
val tipo1ViewHolder = holder as MiniBannerCaruoselViewHolder
tipo1ViewHolder.bind(listaMiniBanner)
}
4 -> {
val listaSquareBanner = item.contenido!!.squareBanners ?: listOf()
val tipo4ViewHolder = holder as SquareBannerCaruoselViewHolder
tipo4ViewHolder.bind(listaSquareBanner)
}
}
}
override fun getItemViewType(position: Int): Int {
return when(itemList[position].idContenido){
"SquareBanners"-> 4
"PillButtons"->1
"MiniBanners"->3
"Productos"->2
else -> 5
}
}
override fun getItemCount(): Int {
return itemList.size
}
}
答:
0赞
K M Rejowan Ahmmed
5/30/2023
#1
迁移到 ListView 不是一个好的解决方案。ListView 将所有项目加载到内存中,而 RecyclerView 仅加载当前可见的项目。如果数据集很大,ListView 可能会消耗更多内存并导致 .OutOfMemoryError
有几件事可以提高性能-
- 使用 setHasFixedSize(true):如果您知道 RecyclerView 的大小不依赖于适配器内容,请设置以下内容以提高性能
- 如果内部 recyclerView 具有复杂的操作,则可以在单独的线程中处理这些操作,并在主线程中更新 UI。您可以使用处理程序或执行程序。
- 如果数据需要处理才能显示,则可以使用闪烁视图将用户保留一段时间,在此期间将处理数据。
0赞
cmak
5/30/2023
#2
始终覆盖,解决大多数问题。getItemId
评论
0赞
Gregorio Scalbi
5/30/2023
你是说性能问题?为什么?
0赞
cmak
6/2/2023
它有助于 recyclerview 正确识别项目,并正确执行操作,并且可能更有效率,并且使用和使用绑定方法尽可能轻setHasStableIds(true)
评论