经典问题方案-今晚吃啥子? -罗非鱼。android技术

Android 使用三个Reyclerview 实现表格布局,支

2021-06-11  本文已影响0人  爱生活的小水缸

这个案例是通过子条目item为recycleview实现多条目联动,使得recycleview支持横向和纵向滑动

话不多说 ,先上Demo演示

image

Demo代码:https://github.com/LgSecret/Linkagelayout

此Demo实现效果就是这种,基本无嵌套。摆脱使用HorizontalScrollView 嵌套横向数据过多而导致的性能问题,自测demo数据横向50条 纵向150条都很丝滑,并且支持内部recycleview自定义多布局实现复杂布局效果。

下面是Demo布局

image

上下滑动整体是一个recycleview 可以直接实现,而左右滑动联动头部一起滑动就是我们要解决的问题,为了避免嵌套解决性能问题,此demo采用了子条目为recycleview 横向滑动 然后联动其它条目 还有头部列表一起滑动策略。

接下来贴出关键实现联动代码

 //多条recycleview联动
    public void initRecyclerView(RecyclerView recyclerView) {
        recyclerView.setHasFixedSize(true);
        //为每一个recycleview创建layoutManager
        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        //todo
        // 通过移动layoutManager来实现列表滑动  此行是让新加载的item条目保持跟已经滑动的recycleview位置保持一致
        // 也就是上拉加载更多的时候  保证新加载出来的item 跟已经滑动的item位置保持一致
        if (layoutManager != null && firstPos > 0 && firstOffset > 0) {
            layoutManager.scrollToPositionWithOffset(firstPos + 1, firstOffset);
        }
        // 添加所有的 recyclerView
        observerList.add(recyclerView);
        //当触摸条目的时候 停止滑动
        recyclerView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_POINTER_DOWN:
                        for (RecyclerView rv : observerList) {
                            rv.stopScroll();
                        }
                }
                return false;
            }
        });
        //添加当前滑动recycleview的滑动监听
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                //获取显示第一个item的位置
                int firstPos1 = linearLayoutManager.findFirstVisibleItemPosition();
                View firstVisibleItem = linearLayoutManager.getChildAt(0);
                if (firstVisibleItem != null) {
                    //获取第一个item的偏移量
                    int firstRight = linearLayoutManager.getDecoratedRight(firstVisibleItem);
                    //遍历其它的所有的recycleview条目
                    for (RecyclerView rv : observerList) {
                        if (recyclerView != rv) {
                            LinearLayoutManager layoutManager = (LinearLayoutManager) rv.getLayoutManager();
                            if (layoutManager != null) {
                                firstPos = firstPos1;
                                firstOffset = firstRight;
                                //通过当前显示item的位置和偏移量的位置来置顶recycleview 也就是同步其它item的移动距离
                                layoutManager.scrollToPositionWithOffset(firstPos + 1, firstRight);
                            }
                        }
                    }
                }
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }
        });
    }

上方的代码还有注释已经很好的解释了如何进行多个recycleview进行联动的方式,主要还是通过

 layoutManager.scrollToPositionWithOffset(firstPos + 1, firstRight);

此方法来实现其它recycleview进行联动 并且联动上方的recycleview

整体思路就是子条目的横向滑动来联动其它条目同步滑动,从而解决整体滑动的问题,避免嵌套HorizontalScrollView 从而提高性能问题。
如果此思路给你带来了帮助 记得github来个start ~ github 地址在文章开头
上一篇下一篇

猜你喜欢

热点阅读