首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView内部RecyclerView不平稳

RecyclerView内部RecyclerView不平稳
EN

Stack Overflow用户
提问于 2015-10-19 15:31:50
回答 3查看 7.1K关注 0票数 3

关于RecyclerView在RecyclerView中有一些主题,但我发现其中大多数主题都不适合我的情况。我的例子是我有一个RecyclerView (垂直线性布局管理)显示一个CardView列表,每个Cardview视图包含一个内部RecyclerView (水平线性布局管理)。问题在于滚动时的性能,根本不是一帆风顺。我注意到,如果我评论内部回收视图的setAdapter,滚动变得平滑,但我使CardView没有更新新的列表。代码类似于以下内容:

代码语言:javascript
复制
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.
}

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

更新(添加更多代码)。

代码语言:javascript
复制
// 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);
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-19 16:52:58

这种方法没有问题,只要它们沿着不同的axes.You滚动,就可以启用RecyclerView.startNestedScroll(int),并且处理像overscroll.This延迟这样的情况,因为您每次都要重新启动一个adpater。您可以尝试一些不同的方法,比如维护一个adpaters地图,并在RecyclerView.swapAdapter(args.)中调用bindVH。

另一个好的步骤也可能是使用RecyclerView.setRecycledViewPool(args.)为回收视图使用公共池。我已经创建和使用了一个清单的100+加上物品与嵌套(不同的轴)回收,并没有遇到问题。

如果您提供更多的代码(在您编写了async loading的地方),我可以帮助您more.But,我建议您通过more.But和设计模式来解决您的问题。

票数 5
EN

Stack Overflow用户

发布于 2017-08-07 12:49:20

@保罗,我也有同样的要求,下面的技巧奏效了。将家长回收视图放在NestedScrollView中,并在您的onCreate方法中设置。

代码语言:javascript
复制
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setNestedScrollingEnabled(false);

这防止了家长回收视图卷轴和卷轴变得绝对平滑。

票数 7
EN

Stack Overflow用户

发布于 2016-02-29 06:59:05

因为有一些用户问我如何存档,所以我将发布我所做的事情。@Droidekas这个词似乎是个不错的观点,但我不明白。

我所做的是:

  1. 每个水平回收者视图都是一个垂直回收者视图中的一个项目。
  2. 当我需要为特定的垂直项(onBindViewHolder)设置数据时,我使用水平回收适配器setNotifyDataSetChanged,而不是设置一个全新的适配器或交换它。这样,我的垂直重合器运行得非常顺利。

垂直重排器适配器结构可以是:

代码语言:javascript
复制
Vertical Item view holder  -> Vertical Item[Name, List<Horizontal item>,...]
Vertical Item view holder  -> Vertical Item[Name, List<Horizontal item>,...]

在OnBindViewHolder中

代码语言:javascript
复制
holder.setData(VerticalItem)

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

代码语言:javascript
复制
setData(VerticalItem item){
    mItems = item.getHorizontalItems();
    mHorizontalAdapter.notifyDataSetChanged();
}

希望能帮上忙。:D

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33218397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档