将 recyclerview 更改为 listview?

Change recyclerview for listview?

提问人:Gregorio Scalbi 提问时间:5/30/2023 更新时间:5/30/2023 访问量:63

问:

我有一个来自数据库的响应,其中包含一个响应项列表,这些响应项包含 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
}

}

Kotlin Android-Recycler查看 Android-ListView

评论


答:

0赞 K M Rejowan Ahmmed 5/30/2023 #1

迁移到 ListView 不是一个好的解决方案。ListView 将所有项目加载到内存中,而 RecyclerView 仅加载当前可见的项目。如果数据集很大,ListView 可能会消耗更多内存并导致 .OutOfMemoryError

有几件事可以提高性能-

  1. 使用 setHasFixedSize(true):如果您知道 RecyclerView 的大小不依赖于适配器内容,请设置以下内容以提高性能
  2. 如果内部 recyclerView 具有复杂的操作,则可以在单独的线程中处理这些操作,并在主线程中更新 UI。您可以使用处理程序或执行程序。
  3. 如果数据需要处理才能显示,则可以使用闪烁视图将用户保留一段时间,在此期间将处理数据。
0赞 cmak 5/30/2023 #2

始终覆盖,解决大多数问题。getItemId

评论

0赞 Gregorio Scalbi 5/30/2023
你是说性能问题?为什么?
0赞 cmak 6/2/2023
它有助于 recyclerview 正确识别项目,并正确执行操作,并且可能更有效率,并且使用和使用绑定方法尽可能轻setHasStableIds(true)