当前位置: 首页 > 知识库问答 >
问题:

嵌套recylerview在开始几个滚动时滞后,然后平稳滚动?

蔚弘量
2023-03-14

我正在使用嵌套的RecycerView。意思是在一个垂直的回收器视图中,我有多个水平的回收器视图

@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
    }
}
 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;
}

}

共有1个答案

彭华皓
2023-03-14

不要每次都在onBindViewholder中创建水平的适配器,而是在每个Viewholder类(ListHolderDeal,ListHolderProduct)中创建适当的适配器。然后,在垂直RecycerViewonbindViewholder中,只需替换该适配器的数据,如果水平RecycerView没有适配器,则用viewholder适配器设置该数据。如果是,则替换该适配器的数据集并调用NotifyDataSetChange。通过这种方法,您可以隐式地使用适配器池,这样GC就可以减少您的麻烦。

希望能有所帮助。

 类似资料:
  • 我刚刚实现了库图表(https://github.com/danielgindi/Charts)在tableview中,当我的图表包含大量数据时,我在滚动过程中遇到了很大的延迟。 我在ChartTableViewCell中有一个方法,我在其中根据从我的视图控制器传递和调用的数据绘制图表。 在我的tableViewController中,我在解析数据后调用函数: 我错过了什么?因为滚动时视图滞后得很

  • 我在线性布局中使用滚动视图,问题是布局响应正常,一旦我开始滚动,它就会滞后太多。 我在我的线性布局中使用了这段代码,一旦我触摸了RadiButton或edittext或我向下滚动,它就开始滞后很多。我无法理解这个问题,我使用的图像尺寸小于100kb

  • 问题内容: 我box-shadow最近在页面的一部分中添加了,以为其提供与Mac OS X应用程序相同的阴影边框效果。看起来不错,但我注意到在页面上上下滚动会使其滞后。我通常只会在页面上贴满恼人的背景图像,大量图像和嵌入视频(咳嗽MySpace咳嗽)的页面上看到此图像。我最初决定使用box-shadow,因为我发现它可以消除使用图像的需要,从而消除滚动滞后的可能性。 我知道CSS3仍然是新的,但这

  • 我使用嵌套的Scrollview来包装recyclerview和其他按钮。它工作得很好,但我注意到当我滚动它时,它并不平滑。请指导如何使滚动平滑。

  • 我在嵌套滚动视图中有一个回收器视图。当回收器视图中有太多数据时,滚动会滞后。除了将回收器视图从嵌套滚动视图中删除之外,还有什么方法可以解决这个问题吗?

  • 我将静态表视图嵌入到容器视图中,问题是当应用程序在父视图控制器中启动时,表视图向下滚动,中继最后一项。我希望看到前3项。 以下是我在父视图控制器和子视图控制器中所做的尝试,但没有成功: 以下是我的问题的图像: