有没有一种方法可以在多个嵌套的RecyclerView之间共享同一个LayoutManager?

5
我正在开发一个展示游戏列表的应用程序,在每个游戏的itemView中,我还有一个视频列表需要显示。这里是预览和结构。
我使用RecyclerView作为窗口根视图,然后对于视频,我使用了网格样式的RecyclerView来显示,所以我们得到了嵌套的RecyclerView结构。但是,由于视频数量在游戏之间不一致,我不希望视频列表的RecyclerView可以滚动,所以最好的方法是使视图的高度根据它有多少行而动态拉伸。我从互联网上听到了令人失望的结论,说没有办法实现这一点。真的吗?有什么替代方案吗?
到目前为止,我���没有想到解决这个问题的方法,所以我手动更改了RecyclerView的高度作为临时解决方案。
videoGridRecyclerView.getLayoutParams().height = rowCount * 242;

考虑到视频项的结构完全相同,如果这些RecyclerView在屏幕上滑动后可以重复使用该视频的itemView,那将会带来更好的性能提升。

因此,我尝试使用特定的RecycledViewPool来向每个嵌套的RecyclerView进行传递。

public class MainActivity extends Activity {
    private RecyclerView.RecycledViewPool mViewPool;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // create the RecycledViewPool from first and re-use for each nested RecyclerViews.
        mViewPool = new RecyclerView.RecycledViewPool();
        ...
    }
}

即使我已经尽力了,但我还是注意到在我循环滑动根RecyclerView时,onCreateViewHolder方法被执行并且inflate计数器也在增加。
private static class VideoAdapter extends RecyclerView.Adapter<GridViewHolder> {
    private List<Video> mVideoList;

    private VideoAdapter(List<Video> videoList) {
        mVideoList = videoList;
    }

    // this method would always invoke during i swipe the RecyclerView.
    @Override
    public GridViewHolder onCreateViewHolder(ViewGroup container, int viewType) {
        Log.e("", String.format("createViewCount : %d", ++MainActivity.STAT_GAME_VIDEO_ITEM_COUNT));
        return new GridViewHolder(inflate(container, R.layout.game_video_item)) {};
    }
}

这个想法是否可行?还是我做错了?我想实现这种效果,如果有其他建议,即使不涉及RecyclerView,也会受到赞赏。谢谢提前。
2个回答

3

目前,我已经使用了GridLayout而不是嵌套的RecyclerView,并对其中的视图进行了自己的回收。但这可能不是一个好的选择,因为我的回收逻辑非常简单。当快速滚动时,应用程序仍然有点卡顿,我还没有找出原因。最终,我将我的代码推送到github上。如果您有想法,请给我建议,谢谢。


2

是的,你所做的是正确的。

只需创建一个RecyclerViewPool(就像你已经做的那样),并通过setRecycledViewPool将其提供给所有的RecyclerView实例。这样,它们将共享同一个视图池。

您可能希望增加其缓存大小,以避免在项目之间的视图数量差异很大时产生视图抖动。

顺便说一句,作为一个副建议,尝试将其合并到一个RecyclerView中,而不是嵌套的RecyclerViews。这样,动画等可以运行得更好。此外,在使用RV内部的RV时,沿着相同方向滚动会有问题,通过将它们合并成一个可以避免这个问题。


2
在我的情况下,是否仍有一种方法可以只使用一个RecyclerView?那么对于大小不确定的视频网格呢?老实说,我不想嵌套RecyclerViews,但我很难找到另一种方法来满足我的需求。如果我误解了您的意思,您能否给我展示一些说明或代码? - VinceStyling
@yigit 我该如何增加缓存大小?我正在使用setMaxRecycledViews(),这有点帮助,但我可以看到onCreateViewHolder()被调用了太多次。我不明白为什么有些视图会被创建而不是被回收利用。我甚至不确定setMaxRecycledViews()方法的第一个参数应该传什么。我的回收器可能只有1个项目,也可能多达20个,当我达到20个项目时,似乎视图没有被回收利用。有没有地方可以查看示例或获取有关在回收器视图中共享池的更多信息?谢谢。 - Sotti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接