RecyclerView封装库和综合案例【包含25篇博客】

简介: 目录介绍1.复杂页面库介绍2.本库优势亮点2.1 支持多种状态切换管理2.2 支持添加多个header和footer2.3 支持侧滑功能和拖拽移动2.4 其他亮点介绍3.如何使用介绍3.

目录介绍

  • 1.复杂页面库介绍
  • 2.本库优势亮点

    • 2.1 支持多种状态切换管理
    • 2.2 支持添加多个header和footer
    • 2.3 支持侧滑功能和拖拽移动
    • 2.4 其他亮点介绍
  • 3.如何使用介绍

    • 3.1 最基础的使用
    • 3.2 添加下拉刷新和加载更多监听
    • 3.3 添加header和footer操作
    • 3.4 设置数据和刷新
    • 3.5 设置adapter
    • 3.6 设置条目点击事件
    • 3.7 设置侧滑删除功能[QQ侧滑删除]
    • 3.8 轻量级拖拽排序与滑动删除
  • 4.关于状态切换

    • 4.1 关于布局内容
    • 4.2 关于实现思路
    • 4.3 关于状态切换api调用
    • 4.4 关于自定义状态布局
    • 4.5 关于自定义布局交互事件处理
  • 5.常用api介绍

    • 5.1 状态切换方法说明
    • 5.2 viewHolder方法说明
    • 5.3 adapter方法说明
    • 5.4 分割线方法说明
    • 5.5 swipe侧滑方法说明
    • 5.6 其他api说明
  • 6.recyclerView的wiki文档【更新中】

    • 6.1 封装库部分思路介绍
    • 6.2 优化处理逻辑介绍
    • 6.3 recyclerView相关类
    • 6.4 recyclerView滑动冲突
    • 6.5 recyclerView缓存机制
    • 6.5 recyclerView相关博客(25篇)
  • 7.实现效果展示

    • 7.1 下拉刷新,上拉加载
    • 7.2 添加多个headerView和FooterView
    • 7.3 横向滑动
    • 7.4 粘贴头部
    • 7.5 与coordinatorLayout结合
    • 7.6 瀑布流效果
  • 8.版本更新说明
  • 9.参考资料说明
  • 10.其他内容介绍

0.recyclerView相关博客

recyclerView可以说应用十分广泛,下面是我逐步整理的博客,结合博客,你也可以一步一步封装自己的recyclerView库。网上虽然介绍recyclerView很多,但是如果要想熟练掌握,一遍应用一边总结一遍记录则也是种不错的做法。

开源库地址[融合大多数recyclerView使用案例,可以直接下载demo]:https://github.com/yangchong211/YCRefreshView

  • 00.RecyclerView复杂封装库

    • 几乎融合了该系列博客中绝大部分的知识点,欢迎一遍看博客一遍实践,一步步从简单实现功能强大的库
  • 01.RecyclerView

    • RecycleView的结构,RecyclerView简单用法介绍
  • 02.Adapter

    • RecyclerView.Adapter扮演的角色,一般常用的重写方法说明,数据变更通知之观察者模式,查看.notifyChanged();源码
  • 03.ViewHolder

    • ViewHolder的作用,如何理解对于ViewHolder对象的数量“够用”之后就停止调用onCreateViewHolder方法,ViewHolder简单封装
  • 04.LayoutManager

    • LayoutManager作用是什么?setLayoutManager源码分析
  • 05.SnapHelper

    • SnapHelper作用,什么是Fling操作 ,SnapHelper类重要的方法,
  • 06.ItemTouchHelper
  • 07.SpanSizeLookup

    • SpanSizeLookup如何使用,同时包含列表,2列的网格,3列的网格如何优雅实现?
  • 08.ItemDecoration

    • ItemDecoration的用途,addItemDecoration()源码分析
  • 09.RecycledViewPool

    • RecyclerViewPool用于多个RecyclerView之间共享View。
  • 11.RecyclerView上拉加载

    • 添加recyclerView的滑动事件,上拉加载分页数据,设置上拉加载的底部footer布局,显示和隐藏footer布局
  • 12.RecyclerView缓存原理

    • RecyclerView做性能优化要说复杂也复杂,比如说布局优化,缓存,预加载,复用池,刷新数据等等
  • 13.SnapHelper源码分析

    • SnapHelper旨在支持RecyclerView的对齐方式,也就是通过计算对齐RecyclerView中TargetView 的指定点或者容器中的任何像素点。
  • 16.自定义SnapHelper

    • 自定义SnapHelper
  • 19.自定义ItemDecoration分割线

    • 需要自定义类实现RecyclerView.ItemDecoration类,并选择重写合适方法
  • 22.RecyclerView问题汇总

    • getLayoutPosition()和getAdapterPosition()的区别
  • 23.RecyclerView滑动冲突

    • 01.如何判断RecyclerView控件滑动到顶部和底部
    • 02.RecyclerView嵌套RecyclerView 条目自动上滚的Bug
    • 03.ScrollView嵌套RecyclerView滑动冲突
    • 04.ViewPager嵌套水平RecyclerView横向滑动到底后不滑动ViewPager
    • 05.RecyclerView嵌套RecyclerView的滑动冲突问题
    • 06.RecyclerView使用Glide加载图片导致图片错乱问题解决
  • 24.ScrollView嵌套RecyclerView问题

    • 要实现在NestedScrollView中嵌入一个或多个RecyclerView,会出现滑动冲突,焦点抢占,显示不全等。如何处理?

1.复杂页面库介绍

  • 自定义支持上拉加载更多【加载中,加载失败[比如没有更多数据],加载异常[无网络],加载成功等多种状态】,下拉刷新,可以实现复杂的状态页面,支持自由切换状态【加载中,加载成功,加载失败,没网络等状态】的控件,拓展功能[支持长按拖拽,侧滑删除]可以选择性添加。具体使用方法,可以直接参考demo案例。
  • 支持复杂type页面,例如添加自定义头部HeaderView和底部布局FooterView,支持横向滑动list,还可以支持粘贴头部list[类似微信好友分组],支持不规则瀑布流效果,支持侧滑删除功能。

2.本库优势亮点

2.1 支持多种状态切换管理

  • 支持在布局中或者代码设置自定义不同状态的view,一行代码既可以切换不同的状态,十分方便。
  • 针对自定义状态view或者layout,可以实现交互功能,比如当切换到网络异常的页面,可以点击页面控件取刷新数据或者跳转设置网络页面

2.2 支持添加多个header和footer

  • 支持添加多个自定义header头部布局,可以自定义footer底部布局。十分方便实现复杂type的布局页面,结构上层次分明,便于维护。
  • 支持复杂界面使用,比如有的页面包含有轮播图,按钮组合,横向滑动list,还有复杂list,那么用这个控件就可以搞定。

2.3 支持侧滑功能和拖拽移动

  • 轻量级侧滑删除菜单,直接嵌套item布局即可使用,使用十分简单
  • 通过自定义ItemTouchHelper实现RecyclerView条目Item拖拽排序,只是设置是否拖拽,设置拖拽item的背景颜色,优化了拖拽效果,比如在拖拽过程中设置item的缩放和渐变效果

2.4 其他亮点介绍

  • 支持上拉加载,下拉刷新。当上拉加载更多失败或者异常时,可以设置自定义加载更多失败或者异常布局(比如没有网络时的场景),同时点击该异常或者失败布局可以恢复加载更多数据;当上拉加载更多没有更多数据时,可以设置自定义加载更多无数据布局。
  • 可以设置上拉加载更多后自动加载下一页数据,也可以上拉加载更多后手动触发加载下一页数据。在上拉加载更多时,可以设置加载更多的布局,支持加载监听。
  • 支持粘贴头部的需求效果,这种效果类似微信好友分组的那种功能界面。
  • 支持插入【插入指定索引】,更新【更新指定索引或者data数据】或者删除某条数据,支持删除所有数据。同时在多线程条件下,添加了锁机制避免数据错乱!
  • 支持横向滑动list效果,支持瀑布流的效果,还支持与CoordinatorLayout结合实现炫酷的效果。这种效果特别不错……
  • 已经用于实际开发项目投资界,新芽,沙丘大学中……且经过近三年时间的迭代与维护,持续更新维护中!

3.如何使用介绍

3.1 最基础的使用

  • 首先在集成:

    • implementation 'org.yczbj:YCRefreshViewLib:2.5.8'
  • 在布局中

    <org.yczbj.ycrefreshviewlib.YCRefreshView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_progress="@layout/view_custom_loading_data"
        app:layout_empty="@layout/view_custom_empty_data"
        app:layout_error="@layout/view_custom_data_error"/>
  • 在代码中,初始化recyclerView

    adapter = new PersonAdapter(this);
    recyclerView.setAdapter(adapter);
    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    adapter.addAll(data);
  • 在代码中,创建adapter实现RecyclerArrayAdapter

    public class PersonAdapter extends RecyclerArrayAdapter<PersonData> {
    
        public PersonAdapter(Context context) {
            super(context);
        }
    
        @Override
        public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) {
            return new PersonViewHolder(parent);
        }
    
        public class PersonViewHolder extends BaseViewHolder<PersonData> {
    
            private ImageView iv_news_image;
    
            PersonViewHolder(ViewGroup parent) {
                super(parent, R.layout.item_news);
                iv_news_image = getView(R.id.iv_news_image);
            }
    
            @Override
            public void setData(final PersonData person){
    
            }
        }
    }

3.2 添加下拉刷新和加载更多监听

  • 下拉刷新监听操作

    //设置刷新listener
    recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            //刷新操作
        }
    });
    //设置是否刷新
    recyclerView.setRefreshing(false);
    //设置刷新颜色
    recyclerView.setRefreshingColorResources(R.color.colorAccent);
  • 上拉加载更多监听操作

    • 第一种情况,上拉加载更多后自动加载下一页数据
    //设置上拉加载更多时布局,以及监听事件
    adapter.setMore(R.layout.view_more, new OnLoadMoreListener() {
        @Override
        public void onLoadMore() {
            //可以做请求下一页操作
        }
    });
    • 第二种情况,上拉加载更多后手动触发加载下一页数据
    adapter.setMore(R.layout.view_more2, new OnMoreListener() {
        @Override
        public void onMoreShow() {
            //不做处理
        }
    
        @Override
        public void onMoreClick() {
            //点击触发加载下一页数据
        }
    });
  • 在上拉加载更多时,可能出现没有更多数据,或者上拉加载失败,该如何处理呢?

    //设置上拉加载没有更多数据监听
    adapter.setNoMore(R.layout.view_no_more, new OnNoMoreListener() {
        @Override
        public void onNoMoreShow() {
            //上拉加载,没有更多数据展示,这个方法可以暂停或者停止加载数据
            adapter.pauseMore();
        }
    
        @Override
        public void onNoMoreClick() {
            //这个方法是点击没有更多数据展示布局的操作,比如可以做吐司等等
            Log.e("逗比","没有更多数据了");
        }
    });
    //设置上拉加载更多异常监听数据监听
    adapter.setError(R.layout.view_error, new OnErrorListener() {
        @Override
        public void onErrorShow() {
            //上拉加载,加载更多数据异常展示,这个方法可以暂停或者停止加载数据
            adapter.pauseMore();
        }
    
        @Override
        public void onErrorClick() {
            //这个方法是点击加载更多数据异常展示布局的操作,比如恢复加载更多等等
            adapter.resumeMore();
        }
    });

3.3 添加header和footer操作

  • 添加headerView操作。至于添加footerView的操作,几乎和添加header步骤是一样的。

    • 添加普通的布局【非listView或者RecyclerView布局】
    adapter.addHeader(new InterItemView() {
        @Override
        public View onCreateView(ViewGroup parent) {
            View inflate = LayoutInflater.from(context).inflate(R.layout.header_view, null);
            return inflate;
        }
    
        @Override
        public void onBindView(View headerView) {
            TextView tvTitle = headerView.findViewById(R.id.tvTitle);
        }
    });
    • 添加list布局【以横向recyclerView为例子】
    adapter.addHeader(new InterItemView() {
        @Override
        public View onCreateView(ViewGroup parent) {
            RecyclerView recyclerView = new RecyclerView(parent.getContext()){
                //为了不打扰横向RecyclerView的滑动操作,可以这样处理
                @SuppressLint("ClickableViewAccessibility")
                @Override
                public boolean onTouchEvent(MotionEvent event) {
                    super.onTouchEvent(event);
                    return true;
                }
            };
            return recyclerView;
        }
    
        @Override
        public void onBindView(View headerView) {
            //这里的处理别忘了
            ((ViewGroup)headerView).requestDisallowInterceptTouchEvent(true);
        }
    });
  • 注意要点

    • 如果添加了HeaderView,凡是通过ViewHolder拿到的position都要减掉HeaderView的数量才能得到正确的position。

3.4 设置数据和刷新

  • 添加所有数据,可以是集合,也可以是数组

    //添加所有数据
    adapter.addAll(data);
    //添加单挑数据
    adapter.add(data);
  • 插入,刷新和删除数据

    //插入指定索引数据,单个数据
    adapter.insert(data, pos);
    //插入指定索引数据,多个数据
    adapter.insertAll(data, pos);
    //刷新指定索引数据
    adapter.update(data, pos);
    //删除数据,指定数据
    adapter.remove(data);
    //删除数据,指定索引
    adapter.remove(pos);
    //清空所有数据

3.5 设置adapter

  • 注意自定义adapter需要实现RecyclerArrayAdapter,其中T是泛型,就是你要使用的bean数据类型

    public class PersonAdapter extends RecyclerArrayAdapter<PersonData> {
    
        public PersonAdapter(Context context) {
            super(context);
        }
    
        @Override
        public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) {
            return new PersonViewHolder(parent);
        }
    
        public class PersonViewHolder extends BaseViewHolder<PersonData> {
    
            private TextView tv_title;
            private ImageView iv_news_image;
    
            PersonViewHolder(ViewGroup parent) {
                super(parent, R.layout.item_news);
                iv_news_image = getView(R.id.iv_news_image);
                tv_title = getView(R.id.tv_title);
    
                //添加孩子的点击事件
                addOnClickListener(R.id.iv_news_image);
                addOnClickListener(R.id.tv_title);
            }
    
            @Override
            public void setData(final PersonData person){
                Log.i("ViewHolder","position"+getDataPosition());
                tv_title.setText(person.getName());
            }
        }
    }

3.6 设置条目点击事件[item条目点击事件,item条目孩子view点击事件]

  • 条目单击点击事件,长按事件[省略,可以自己看代码]

    adapter.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(int position) {
    if (adapter.getAllData().size()>position && position>=0){
        //处理点击事件逻辑
    }
    }
    });
  • 条目中孩子的点击事件

    //添加孩子的点击事件,可以看3.5设置adapter
    addOnClickListener(R.id.iv_news_image);
    addOnClickListener(R.id.tv_title);
    
    //设置孩子的点击事件
    adapter.setOnItemChildClickListener(new OnItemChildClickListener() {
    @Override
    public void onItemChildClick(View view, int position) {
    switch (view.getId()){
        case R.id.iv_news_image:
            Toast.makeText(HeaderFooterActivity.this,
                    "点击图片了",Toast.LENGTH_SHORT).show();
            break;
        case R.id.tv_title:
            Toast.makeText(HeaderFooterActivity.this,
                    "点击标题",Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
    }
    });

3.7 设置侧滑删除功能[QQ侧滑删除]

  • 在布局文件中,这里省略部分代码

    <org.yczbj.ycrefreshviewlib.swipeMenu.YCSwipeMenu
        android:orientation="horizontal">
        <!--item内容-->
        <RelativeLayout
        </RelativeLayout>
    
        <!-- 侧滑菜单 -->
        <Button
            android:id="@+id/btn_del"/>
        <Button
            android:id="@+id/btn_top"/>
    </org.yczbj.ycrefreshviewlib.swipeMenu.YCSwipeMenu>
  • 在代码中设置

    • 在adapter中定义接口
    private OnSwipeMenuListener listener;
    public void setOnSwipeMenuListener(OnSwipeMenuListener listener) {
        this.listener = listener;
    }
    • 在adapter设置点击事件
    View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_del:
                    if (null != listener) {
                        listener.toDelete(getAdapterPosition());
                    }
                    break;
                case R.id.btn_top:
                    if (null != listener) {
                        listener.toTop(getAdapterPosition());
                    }
                    break;
            }
        }
    };
    btn_del.setOnClickListener(clickListener);
    btn_top.setOnClickListener(clickListener);
  • 处理置顶或者删除的功能

    adapter.setOnSwipeMenuListener(new OnSwipeMenuListener() {
        //删除功能
        @Override
        public void toDelete(int position) {
    
        }
    
        //置顶功能
        @Override
        public void toTop(int position) {
    
        }
    });

3.8 轻量级拖拽排序与滑动删除

  • 处理长按拖拽,滑动删除的功能。轻量级,自由选择是否实现。

    mCallback = new DefaultItemTouchHelpCallback(new DefaultItemTouchHelpCallback
                    .OnItemTouchCallbackListener() {
    @Override
    public void onSwiped(int adapterPosition) {
    // 滑动删除的时候,从数据库、数据源移除,并刷新UI
    }
    
    @Override
    public boolean onMove(int srcPosition, int targetPosition) {
    return false;
    }
    });
    mCallback.setDragEnable(true);
    mCallback.setSwipeEnable(true);
    mCallback.setColor(this.getResources().getColor(R.color.colorAccent));
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(mCallback);
    itemTouchHelper.attachToRecyclerView(recyclerView);

4.关于状态切换

4.1 关于布局内容

  • YCRecyclerView是一个组合自定义控件,其布局如下所示

     <!--刷新控件    省略部分代码-->
    <android.support.v4.widget.SwipeRefreshLayout>
        <FrameLayout>
            <!--RecyclerView控件-->
            <android.support.v7.widget.RecyclerView/>
            <!--加载数据为空时的布局-->
            <FrameLayout/>
            <!--正在加载数据中的布局-->
            <FrameLayout/>
            <!--加载错误时的布局:网络错误或者请求数据错误-->
            <FrameLayout/>
        </FrameLayout>
    </android.support.v4.widget.SwipeRefreshLayout>

4.2 关于实现思路

  • 关于页面状态切换的思路

    • 第一种方式:直接把这些界面include到main界面中,然后动态去切换界面,后来发现这样处理不容易复用到其他项目中,而且在activity中处理这些状态的显示和隐藏比较乱
    • 第二种方式:利用子类继承父类特性,在父类中写切换状态,但有些界面如果没有继承父类,又该如何处理
  • 而本库采用的做法思路

    • 一个帧布局FrameLayout里写上4种不同类型布局,正常布局,空布局,加载loading布局,错误布局[网络异常,加载数据异常]
    • 当然也可以自定义这些状态的布局,通过addView的形式,将不同状态布局添加到对应的FrameLayout中。而切换状态,只需要设置布局展示或者隐藏即可。

4.3 关于状态切换api调用

  • 如下所示

    //设置加载数据完毕状态
    recyclerView.showRecycler();
    //设置加载数据为空状态
    recyclerView.showEmpty();
    //设置加载错误状态
    recyclerView.showError();
    //设置加载数据中状态
    recyclerView.showProgress();

4.4 关于自定义状态布局

  • 如下所示

    //设置空状态页面自定义布局
    recyclerView.setEmptyView(R.layout.view_custom_empty_data);
    recyclerView.setEmptyView(view);
    //获取空页面自定义布局
    View emptyView = recyclerView.getEmptyView();
    
    //设置异常状态页面自定义布局
    recyclerView.setErrorView(R.layout.view_custom_data_error);
    recyclerView.setErrorView(view);
    
    //设置加载loading状态页面自定义布局
    recyclerView.setProgressView(R.layout.view_progress_loading);
    recyclerView.setProgressView(view);

4.5 关于自定义布局交互事件处理

  • 有时候,加载页面出现异常情况,比如没有网络会显示自定义的网络异常页面。现在需要点击异常页面按钮等等操作,那么该如何做呢?

    //注意需要
    LinearLayout ll_error_view = (LinearLayout) recyclerView.findViewById(R.id.ll_error_view);
    ll_error_view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    //比如,跳转到网络设置页面,或者再次刷新数据,或者其他操作等等
    }
    });

5.常用api介绍

  • 状态切换方法说明

    //设置加载数据完毕状态
    recyclerView.showRecycler();
    //设置加载数据为空状态
    recyclerView.showEmpty();
    //设置加载错误状态
    recyclerView.showError();
    //设置加载数据中状态
    recyclerView.showProgress();
    //设置自定义布局,其他几个方法同理
    recyclerView.setEmptyView(R.layout.view_custom_empty_data);
  • viewHolder方法说明

    //子类设置数据方法
    setData方法
    //findViewById方式
    iv_news_image = getView(R.id.iv_news_image);
    //获取上下文
    Context context = getContext();
    //获取数据索引的位置
    int dataPosition = getDataPosition();
    //添加item中子控件的点击事件
    addOnClickListener(R.id.tv_title);
  • adapter方法说明

    //删除索引处的数据
    adapter.remove(0);
    //触发清空所有数据
    adapter.removeAll();
    //添加数据,注意这个是在最后索引处添加
    adapter.add(new PersonData());
    //添加所有数据
    adapter.addAll(DataProvider.getPersonList(0));
    //插入数据
    adapter.insert(data,3);
    //在某个索引处插入集合数据
    adapter.insertAll(data,3);
    //获取item索引位置
    adapter.getPosition(data);
    //触发清空所有的数据
    adapter.clear();
    //获取所有的数据
    adapter.getAllData();
    
    //清除所有footer
    adapter.removeAllFooter();
    //清除所有header
    adapter.removeAllHeader();
    //添加footerView
    adapter.addFooter(view);
    //添加headerView
    adapter.addHeader(view);
    //移除某个headerView
    adapter.removeHeader(view);
    //移除某个footerView
    adapter.removeFooter(view);
    //获取某个索引处的headerView
    adapter.getHeader(0);
    //获取某个索引处的footerView
    adapter.getFooter(0);
    //获取footer的数量
    adapter.getFooterCount();
    //获取header的数量
    adapter.getHeaderCount();
    
    //设置上拉加载更多的自定义布局和监听
    adapter.setMore(R.layout.view_more,listener);
    //设置上拉加载更多的自定义布局和监听
    adapter.setMore(view,listener);
    //设置上拉加载没有更多数据布局
    adapter.setNoMore(R.layout.view_nomore);
    //设置上拉加载没有更多数据布局
    adapter.setNoMore(view);
    //设置上拉加载没有更多数据监听
    adapter.setNoMore(R.layout.view_nomore,listener);
    //设置上拉加载异常的布局
    adapter.setError(R.layout.view_error);
    //设置上拉加载异常的布局
    adapter.setError(view);
    //设置上拉加载异常的布局和异常监听
    adapter.setError(R.layout.view_error,listener);
    //暂停上拉加载更多
    adapter.pauseMore();
    //停止上拉加载更多
    adapter.stopMore();
    //恢复上拉加载更多
    adapter.resumeMore();
    
    //获取上下文
    adapter.getContext();
    //应该使用这个获取item个数
    adapter.getCount();
    //设置操作数据[增删改查]后,是否刷新adapter
    adapter.setNotifyOnChange(true);
    
    //设置孩子点击事件
    adapter.setOnItemChildClickListener(listener);
    //设置条目点击事件
    adapter.setOnItemClickListener(listener);
    //设置条目长按事件
    adapter.setOnItemLongClickListener(listener);
  • 分割线方法说明

    //可以设置线条颜色和宽度的分割线
    //四个参数,上下文,方向,线宽,颜色
    final RecycleViewItemLine line = new RecycleViewItemLine(this, LinearLayout.HORIZONTAL,
            (int)AppUtils.convertDpToPixel(1,this),
            this.getResources().getColor(R.color.color_f9f9f9));
    recyclerView.addItemDecoration(line);
    
    //适用于瀑布流中的间距设置
    SpaceViewItemLine itemDecoration = new SpaceViewItemLine(
            (int) AppUtils.convertDpToPixel(8,this));
    itemDecoration.setPaddingEdgeSide(true);
    itemDecoration.setPaddingStart(true);
    itemDecoration.setPaddingHeaderFooter(true);
    recyclerView.addItemDecoration(itemDecoration);
    
    //可以设置线条颜色和宽度,并且可以设置距离左右的间距
    DividerViewItemLine itemDecoration = new
            DividerViewItemLine( this.getResources().getColor(R.color.color_f9f9f9)
            , LibUtils.dip2px(this, 1f),
            LibUtils.dip2px(this, 72), 0);
    itemDecoration.setDrawLastItem(false);
    recyclerView.addItemDecoration(itemDecoration);
  • 其他api说明

6.recyclerView的wiki文档【更新中】

6.1 封装库部分思路介绍

  • 01.整体封装思路
  • 02.添加下拉刷新
  • 03.添加header和footer
  • 04.添加上拉加载
  • 05.接口分离法则
  • 06.泛型在框架中应用
  • 07.封装adapter
  • 08.封装ViewHolder
  • 09.状态管理切换
  • 10.View事件分发运用
  • 11.侧滑删除功能
  • 12.Item拖拽排序与滑动删除
  • 13.自定义ItemDecoration

6.2 优化处理逻辑介绍

  • 01.接口分离优化
  • 02.去除淡黄色警告
  • 03.SparseArray替代HashMap
  • 04.瀑布流图片错乱问题解决
  • 05.关于点击事件放在哪里优化
  • 06.ViewHolder优化
  • 07.连续上拉加载更多优化
  • 08.拖拽排序与滑动删除优化
  • 09.暂停或停止加载数据优化
  • 10.状态切换交互优化
  • 11.异常情况下保存状态
  • 12.多线程下插入数据优化
  • 13.recyclerView滑动卡顿优化

6.3 recyclerView相关类

  • 01.recyclerView
  • 02.layoutManager
  • 03.adapter
  • 04.viewHolder
  • 05.SnapHelper
  • 06.ItemTouchHelper
  • 07.SpanSizeLookup
  • 08.ItemDecoration

6.4 recyclerView滑动冲突

  • 01.如何判断RecyclerView控件滑动到顶部和底部
  • 02.RecyclerView嵌套RecyclerView 条目自动上滚的Bug
  • 03.ScrollView嵌套RecyclerView滑动冲突
  • 04.ViewPager嵌套水平RecyclerView横向滑动到底后不滑动ViewPager
  • 05.RecyclerView嵌套RecyclerView的滑动冲突问题
  • 06.RecyclerView使用Glide加载图片导致图片错乱问题解决

6.5 recyclerView缓存机制

  • 01.性能如何优化
  • 02.RecyclerView绘制原理图
  • 03.绘制原理分析过程
  • 04.缓存机制
  • 05.屏幕滑动时分析

7.实现效果展示

7.1 使用过YCRefreshView库的案例代码

7.2 图片展示效果

1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
10.jpg
11.jpg
12.jpg

7.3 部分案例图展示[部分案例图可以参考7.1]

image
image

8.版本更新说明

  • v1.0 更新于2016年11月2日
  • v1.1 更新于2017年3月13日
  • v1.3 更新于2017年8月9日
  • v1.…… 更新于2018年1月5日
  • v2.2 更新于2018年1月17日
  • v2.3 更新于2018年2月9日
  • v2.4 更新于2018年3月19日
  • v2.5.6 更新于2018年8月6日
  • v2.5.7 更新于2019年3月3日
  • v2.5.8 更新于2019年3月4日

9.参考资料说明

10.其他内容介绍

01.关于博客汇总链接

02.关于我的博客

开源库地址[融合大多数recyclerView使用案例,可以直接下载demo]:https://github.com/yangchong211/YCRefreshView

目录
相关文章
|
6月前
|
存储 编译器 C#
C#基础补充
C#基础补充
41 0
|
6月前
|
Web App开发 JSON 前端开发
SAP UI5 进阶 - JSON 模型字段里的值,显示在最终 UI5 界面上的奥秘分析试读版
SAP UI5 进阶 - JSON 模型字段里的值,显示在最终 UI5 界面上的奥秘分析试读版
30 0
|
1月前
|
存储 XML 编译器
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
48 3
|
4月前
|
XML 安全 Java
Android Studio App开发入门之活动Activity中为活动补充附加信息讲解及实战(附源码 超详细必看)
Android Studio App开发入门之活动Activity中为活动补充附加信息讲解及实战(附源码 超详细必看)
36 0
|
7月前
|
Web App开发 JSON 前端开发
授人以渔 - 如何自行查询任意 SAP UI5 控件属性的文档和技术实现细节试读版
授人以渔 - 如何自行查询任意 SAP UI5 控件属性的文档和技术实现细节试读版
38 0
|
设计模式 Java API
Android组件化开发(七)--从零开始教你分析项目需求并实现
前面几篇文章我们封装了几个组件化功能组件:包括:**网络请求组件,图片加载请求组件,应用保活组件,音乐播放组件封装。** > 每个组件都可以直接拿到自己项目中使用,当然还需根据自己项目要求进行优化。
|
Shell 数据库 Android开发
【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★
【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★
242 0
|
新零售 存储 前端开发
一「表」走天下,Flutter瀑布流及通用列表解决方案
目前闲鱼业务中无论是首页还是搜索页都有大量可以落地瀑布流的场景,而在Flutter原生中只提供了ListView, GridView,无法提供自定义布局的能力。 而在社区中,一般瀑布流的解决方案都是基于SliverMultiBoxAdaptor对其performLayout进行定制,主要存在的问题是缺乏复用机制,并且在很多情形下容易出现重复布局,在线上业务的复杂场景下容易出现帧数偏低的问题, 闪屏的问题。同时对于Child生命周期,打点曝光等一系列基础功能的支持还是一片空白的状态。 所以,我们迫切需要一个更为通用的可以解决复杂布局过程同时能够对基础能力进行扩充的列表视图解决方案。
1481 0
一「表」走天下,Flutter瀑布流及通用列表解决方案
【小试身手】几个自定义控件的组合应用,实现简单的“增删改查”功能(有源码)
     分页控件、查询控件、显示数据的控件和表单控件,终于把这几个控件结合在一起了,和在一起之后就可以让“增删改查”变的非常的简单和容易了,当然还需要数据访问函数库的支持。      综合演示的IDE是 vs2008,.net Framework2.0,C#, B/S 。
1023 0