嵌套的recylerview滞后,而前几个滚动,然后顺利滚动?

amo*_*the 7 performance android adapter android-viewholder android-recyclerview

我正在使用嵌套的RecyclerView.在垂直RecyclerView内的手段我有多个水平回收视图

我将适配器附加到父RecyclerView的onBindViewHolder方法内的水平recylerviews,如下所示.

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

现在每当我滚动页面时,由于我将适配器连接到OnBindViewHolder上的水平RecyclerView,所以它有点滞后

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

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

它是滞后的,因为之前每次为列表调用setAdapter.

更新我正在扩展LinearLayoutManager,并在我设置extraLayout空间已修复我的问题但我不知道这是正确的方式我是设置额外的空间如下.

 layoutManager.setExtraLayoutSpace(2 * this.getResources().getDisplayMetrics().heightPixels);
Run Code Online (Sandbox Code Playgroud)

而follwoing是自定义布局管理器类

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;
}
Run Code Online (Sandbox Code Playgroud)

}

小智 5

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

我希望它有帮助。


Pet*_*ker 2

我在滚动时遇到了同样的问题,因为滚动时加载图像。因此,您需要使用Picasso库来加载图像,并pause_tag在使用 onScrollListener 时进行制作。

在你的onBindViewHolder Picasso.with(context) .load(foodData.getRecipe_resize_image_url()) .resize(width, height) .placeholder(R.drawable.empty_image) .tag("resume_tag") .into(mainViewHolder.food_picture);

在你的onScrollListener

@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    final Picasso picasso = Picasso.with(context);
    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
        picasso.resumeTag("resume_tag");
    } else {
        picasso.pauseTag("resume_tag");
    }

}
Run Code Online (Sandbox Code Playgroud)