美文网首页技术干货
仿京东、淘宝首页,通过两层嵌套的RecyclerView实现ta

仿京东、淘宝首页,通过两层嵌套的RecyclerView实现ta

作者: 落后程序员 | 来源:发表于2020-01-07 14:45 被阅读0次

    原文地址
    仿京东、淘宝首页,通过两层嵌套的RecyclerView实现tab的吸顶效果
    前短时间看到这个大佬写了这个文章,由于大佬用kt写的,我项目还是用java代码编写的,只能参考大佬写的思路自己写了一遍,由于我的砖石不够,没办法放视频,我只能贴个图

    示例
    下面是我部分代码的逻辑

    ParentRecyclerView.java

    public ParentRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
    
            mFlingHelper = new FlingHelper(context);
    
            addOnScrollListener(new OnScrollListener() {
                @Override
                public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    //如果父RecyclerView fling过程中已经到底部,需要让子RecyclerView滑动神域的fling
                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                        dispatchChildFling();
                    }
                }
    
                @Override
                public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    if (isStartFling) {
                        totalDy = 0;
                        isStartFling = false;
                    }
                    //在RecyclerView fling情况下,记录当前RecyclerView在y轴的便宜
                    totalDy += dy;
                }
            });
        }
    

    另外我的viewpager里面是fragment不是直接view

                    TabLayout tabLayout = helper.getView(R.id.tabLayout);
                    ViewPager viewPager = helper.getView(R.id.viewPager);
                    if (lifecyclePagerAdapter == null) {
                        lifecyclePagerAdapter = new MaxLifecyclePagerAdapter(mActivity.getSupportFragmentManager());
                        //通过post之后在设置
                        viewPager.post(() -> {
                            lifecyclePagerAdapter.setData(viewFragments, titles);
                            viewPager.setAdapter(lifecyclePagerAdapter);
                            int size = titles.size();
                            viewPager.setOffscreenPageLimit(size);
                            viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                                @Override
                                public void onPageSelected(int position) {
                                    super.onPageSelected(position);
                                    NestedRecyclerViewFragment fragment = (NestedRecyclerViewFragment) viewFragments.get(position);
                                    childRecyclerView = fragment.getChildRecyclerView();
                                }
                            });
                            tabLayout.setupWithViewPager(viewPager);
                            tabLayout.setTabIndicatorFullWidth(false);
                            int currentItem = viewPager.getCurrentItem();
                            NestedRecyclerViewFragment fragment = (NestedRecyclerViewFragment) viewFragments.get(currentItem);
                            //传递ParentRecyclerView
                            fragment.setParentRecyclerView((ParentRecyclerView) getRecyclerView());
                            childRecyclerView = fragment.getChildRecyclerView();
                        });
                    }
    

    因为我把activtiy传到adapter里面了,所以实现了LifecycleObserver接口类

    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        void onDestroy() {
            WLog.i("mo", "onDestroy");
            mActivity = null;
            childRecyclerView = null;
            titles.clear();
            viewFragments.clear();
        }
    

    在activity处理

            multiItemQuickAdapter = new NestedParentMultiItemQuickAdapter(this, null);
    
            multiItemQuickAdapter.bindToRecyclerView(mViewDataBinding.parentView);
    
            GridLayoutManager gridLayoutManager = mViewDataBinding.parentView.initLayoutManager(12);
            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    NestedParentMultiItemEntity nestedMultiItemEntity = multiItemQuickAdapter.getData().get(position);
                    int itemType = nestedMultiItemEntity.getItemType();
                    switch (itemType) {
                        case 1:
                        case 3:
                        case 5:
                            return 12;
    
                        case 4:
                            return 4;
                    }
                    return 3;
                }
            });
    
            //监听生命周期
            getLifecycle().addObserver(multiItemQuickAdapter);
    

    别的就不多了,反正就是抄人代码
    最后我的代码WalleLibrary

    相关文章

      网友评论

        本文标题:仿京东、淘宝首页,通过两层嵌套的RecyclerView实现ta

        本文链接:https://www.haomeiwen.com/subject/advractx.html