RecyclerView里面的RecyclerView并不顺利

时间:2015-10-19 15:31:51

标签: android android-recyclerview

在RecyclerView中有一些关于RecyclerView的主题,但我发现大多数都不适合我的情况。我的情况是我有一个RecyclerView(垂直线性布局管理)显示一个CardView列表,每个Cardview包含一个内部的RecyclerView(水平线性布局管理)。问题在于滚动时的性能,它根本不是平滑的。我注意到如果我为内部Recyclerview评论setAdapter,scrooling变得平滑,但我让CardView没有更新新列表。代码与此类似:

onBindViewHolder...{
    holder.innerRecycler.setAdapter(new InnerAdapter((data));
    // comment that line make the outer recyclerview smoothly but the CardView data not updated thanks to the view recycling.
}

我知道可滚动视图中的可滚动视图不是一个好主意,但我没有看到任何其他选择。以前有人面对这种布局吗?感谢。

更新(添加更多代码)。

// init outer recyclerview
mOuterRecyclerView = (RecyclerView) findViewById(...);
mOuterRecyclerView.setLayoutManagement(new LinearLayoutManagement(this));
mOuterRecyclerView.setHasFixedSize(true);
mOuterRecyclerView.setAdapter(new OuterAdapter(dataList));

// The adapter class for the outer one
onBindViewHolder(...){
    final dataItem = mItems.get(position);
    holder.innerRecycler.setAdapter(new InnerAdapter(dataItem.getList()));
}

// the holder for the outer
class MyHolder extends ViewHolder{
    RecyclerView innerRecycler;
    public MyHolder(View view){
        super(..);
        innerRecycler = findViewById(...);
    }
}
// the adapter for the inner
onBindViewHolder(...){
    final dataItem = mItems.get(pos);
    // async loading
    holder.tvTitle.setText(dataItem.getTitle);
}

布局非常简单,所以我不在这里发布完整的代码。 :)

3 个答案:

答案 0 :(得分:4)

@Paul我有相同的要求,下面的技巧奏效了。 将父recyclelerview放在NestedScrollView和onCreate方法中, 集。

mRecyclerView.setHasFixedSize(true);
mRecyclerView.setNestedScrollingEnabled(false);

这可以防止滚动父回收者视图并滚动变得非常流畅。

答案 1 :(得分:3)

这种方法没有问题,只要它们沿着不同的轴滚动。你可以启用RecyclerView.startNestedScroll(int)并处理过度滚动等情况。这种延迟是因为你每次都重新启动一个adpater。您可以尝试不同的方法,例如维护adpaters地图并在bindVH中调用RecyclerView.swapAdapter(args...)

另一个好的步骤也可能是使用公共池来使用RecyclerView.setRecycledViewPool(args...)来回收视图。 我创建并使用了一个包含嵌套(不同轴)回收器的100多个项目的列表,并且没有遇到问题。

如果您要提供更多代码(您已编写async loading的地方),我可以为您提供更多帮助。但我建议您仔细阅读API和设计模式,以解决您的问题。

答案 2 :(得分:0)

由于有一些用户问我如何存档,我将发布我的工作。 @Droidekas似乎是一个好点,但我不遵循这一点。

我做的是:

  1. 每个水平回收者视图都是垂直回收者视图的项目

  2. 当我需要为特定的垂直项目(onBindViewHolder)设置数据时,我使用水平回收器适配器setNotifyDataSetChanged而不是设置一个全新的适配器或交换它。通过这种方式,我可以非常顺利地运行垂直再生器。

  3. 垂直recyler适配器结构可以是:

    Vertical Item view holder  -> Vertical Item[Name, List<Horizontal item>,...]
    Vertical Item view holder  -> Vertical Item[Name, List<Horizontal item>,...]
    

    在OnBindViewHolder

    holder.setData(VerticalItem)
    

    在Holder中,我有一个setData方法,如下所示:

    setData(VerticalItem item){
        mItems = item.getHorizontalItems();
        mHorizontalAdapter.notifyDataSetChanged();
    }
    

    希望它有所帮助。 :d