gpt4 book ai didi

android - 嵌套的 recyclerview 在前几次滚动然后平滑滚动时滞后?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:59:24 27 4
gpt4 key购买 nike

我正在使用嵌套的 RecyclerView。意味着在垂直 RecyclerView 中我有多个水平回收器 View

我将适配器附加到父 RecyclerView 的 onBindViewHolder 方法内的水平回收 View ,如下所示。

@Override
public void onBindViewHolder(final MainViewHolder holder, final int position) {
switch (holder.getItemViewType()) {
case TYPE_PRODUCT:
((ListHolderProduct) holder).itemTitle.setText(browseCategoryHomePageItems.get(position).displayName.toUpperCase());
((ListHolderProduct) holder).recyclerView.setAdapter(new CarouselProductsRecyclerAdapter(context
, browseCategoryHomePageItems.get(position).products
, R.layout.activity_categoryhome_products_grid_item
, nestedRecyclerItemClickedListener
, position));
break;
case TYPE_DEAL:
((ListHolderDeal) holder).itemTitle.setText(browseCategoryHomePageItems.get(position).displayName.toUpperCase());
((ListHolderDeal) holder).recyclerView.setAdapter(new CarouselDealsRecyclerAdapter(context
, browseCategoryHomePageItems.get(position).dealItems
, R.layout.activity_categoryhome_deals_grid_item
, nestedRecyclerItemClickedListener
, position));
break;
//few more types like this
}
}

现在每当我滚动页面时它都会有点滞后,因为我将适配器附加到 OnBindViewHolder 上的水平 RecyclerView

并且可以有 N 个 TYPE_PRODUCT 或任何类型的水平列表。意味着可以有多个相同类型的水平列表。

知道如何优化这个东西并提高滚动速度。

这是滞后的,因为以前每次都为列表调用 setAdapter。

关于此的更新我正在扩展 LinearLayoutManager 并且我正在设置 extraLayout 空间这已经解决了我的问题但我不知道这是不是正确的方法我正在设置额外的空间如下。

 layoutManager.setExtraLayoutSpace(2 * this.getResources().getDisplayMetrics().heightPixels);

下面是自定义布局管理器类

public class PreCachingLayoutManager extends LinearLayoutManager {
private static final int DEFAULT_EXTRA_LAYOUT_SPACE = 600;
private int extraLayoutSpace = -1;
private Context context;

public PreCachingLayoutManager(Context context) {
super(context);
this.context = context;
}

public PreCachingLayoutManager(Context context, int extraLayoutSpace) {
super(context);
this.context = context;
this.extraLayoutSpace = extraLayoutSpace;
}

public PreCachingLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
this.context = context;
}

public void setExtraLayoutSpace(int extraLayoutSpace) {
this.extraLayoutSpace = extraLayoutSpace;
}

@Override
protected int getExtraLayoutSpace(RecyclerView.State state) {
if (extraLayoutSpace > 0) {
return extraLayoutSpace;
}
return DEFAULT_EXTRA_LAYOUT_SPACE;
}

最佳答案

不要每次都在 onBindViewHolder 中创建水平的 adapter,而是在每个 ViewHolder 类(ListHolderDeal, ListHolderProduct)中创建适当的适配器。然后在垂直 RecyclerviewonBindViewHolder 中替换该适配器的数据,如果水平 RecyclerView 没有适配器,则将其设置为 viewholder 适配器.如果是,则替换该适配器 的数据集并调用notifyDataSetChange。通过这种方法,您可以隐式使用适配器池,这样 GC 就不会那么麻烦了。

希望对你有帮助。

关于android - 嵌套的 recyclerview 在前几次滚动然后平滑滚动时滞后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35915069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com