自己实现的一个多层RecyclerView进行嵌套并吸顶的开源框架

本文介绍了如何实现一个多层RecyclerView嵌套并实现吸顶效果的开源框架。通过在RecyclerView的onScrolled记录偏移,处理fling效果,以及管理嵌套滚动,使得在特定边界场景下仍能流畅滑动。详细步骤包括框架的集成、使用方法及原理分析。
摘要由CSDN通过智能技术生成

项目中有时候会让一个界面出现多个RecyclerView来进行嵌套的情况,如淘宝,京东首页的界面。

当我们自己的应用的页面和淘宝、京东首页效果类似,上面为配置数据,中间是各种分类频道,下面是商品流数据,商品流部分支持左右横滑,分类频道是支持吸顶的下面的左图是京东首页效果图,右图是自己实现的,也都能实现。先看效果图,后面介绍该框架的使用情况:

一、框架使用

(1)在项目的最外层build.gradle中的repositories 闭包中新增支持jitpack的库如下:

maven { url 'https://jitpack.io' }

(2)在app目录下的build.gradle的dependencies闭包中该框架的远程依赖添加(目前最新版本2.0.3):

implementation 'com.github.AndyYuan317:NestedVVRecyclerView:2.0.2'

然后点击Sync Now同步下载,AndroidStudio会自动下载该远程依赖,完成后在External Libraries中会出现如下图:

(3)这样基本集成就完成了,下面开始讲解使用,比如直接新建一个Demo只有Hello World!,打开主界面的xml文件改成如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/swipeRefreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true">

    <!--    android:focusable="true"
            android:focusableInTouchMode="true"
            出现滚动的时候在外层获取焦点来实现初始化后的自动滚动-->
    <com.andyyuan.nestedvvrecyclerview.java.view.ParentRecyclerView
        android:id="@+id/javaRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never" />

</LinearLayout>

(4):主界面的代码为:

/**
 * author : AndyYuan
 * date   : 2020/12/9 000915:02
 * desc   : 主界面,只有两层的RecyclerView嵌套
 * version: 2.0
 */
public class MainJavaActivity extends AppCompatActivity {

    //父类数据
    ArrayList<Object> mDataList = new ArrayList<Object>();
    //子类数据
    ArrayList<String> mChildDataList = new ArrayList<>();
    //子类Fragment
    ArrayList<MyFragment> mChildFragmentList = new ArrayList<>();

    MyMultiTypeAdapter adapter = new MyMultiTypeAdapter(this,mDataList, mChildDataList, getSupportFragmentManager());

    //StoreSwipeRefreshLayout storeSwipeRefreshLayout;
    //SmartRefreshLayout smartRefreshLayout;
    private boolean isRefresh = false;

    ParentRecyclerView javaRecyclerView;

    Long lastBackPressedTime = 0L;

    String[] strArray = new String[]{"推荐", "视频", "直播", "图片", "精华", "热门"};

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

        javaRecyclerView = findViewById(R.id.parent_recycler_view);
        //storeSwipeRefreshLayout = findViewById(R.id.swipe_refresh_layout);
        //smartRefreshLayout = findViewById(R.id.refreshLayout);
        //设置是否启用越界拖动(仿苹果效果)
        //smartRefreshLayout.setEnableOverScrollDrag(false);
        //设置回弹动画市场
        //smartRefreshLayout.setReboundDuration(50);
        javaRecyclerView.setAdapter(adapter);
        javaRecyclerView.initLayoutManager(this);
        refresh();
    }


    @Override
    public void onBackPressed() {
        if (System.currentTimeMillis() - lastBackPressedTime < 2000) {
            super.onBackPressed();
        } else {
            javaRecyclerView.scrollToPosition(0);
            Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
            lastBackPressedTime = System.currentTimeMillis();
        }
    }

    private void refresh() {
        initParentData();
        initChildData();
        CategoryBean categoryBean = new CategoryBean();
        categoryBean.getTabTitleList().clear();
        categoryBean.getTabTitleList().addAll(Arrays.asList(strArray));
        mDataList.add(categoryBean);
        adapter.notifyDataSetChanged();
        //storeSwipeRefreshLayout.setRefreshing(false);
        //第一次滑动出现的卡顿问题
//        javaRecyclerView.smoothScrollToPosition(adapter.getItemCount()-1);
//        javaRecyclerView.smoothScrollToPosition(0);
        //自己新增的,初始化进入会吸顶。
        // 也可以直接在父布局中添加android:focusable="true"
        // android:focusableInTouchMode="true"
        //javaRecyclerView.smoothScrollToPosition(0);
    }

    //初始化父类数据
    private void initParentData() {
        mDataList.c
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值