• Stars
    star
    454
  • Rank 96,373 (Top 2 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created almost 7 years ago
  • Updated almost 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

自定义支持上拉加载更多,下拉刷新,可以自定义头部和底部,可以添加多个headerView,使用一个原生recyclerView就可以搞定复杂界面。支持自由切换状态【加载中,加载成功,加载失败,没网络等状态】的控件,可以自定义状态视图View。拓展功能【支持长按拖拽,侧滑删除】,轻量级,可以选择性添加 。持续更新……

目录介绍

  • 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.案例演示

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 最基础的使用

  • 首先在集成:
    //recyclerView封装库
    implementation 'com.github.yangchong211.YCRefreshView:RefreshViewLib:3.0.2'
    //整体item侧滑库
    implementation 'com.github.yangchong211.YCRefreshView:SlideViewLib:3.0.2'
    //仿汽车之家画廊库
    implementation 'com.github.yangchong211.YCRefreshView:PhotoCoverLib:3.0.2'
    //标签多选单选库
    implementation 'com.github.yangchong211.YCRefreshView:SelectViewLib:3.0.2'
    //之前简单型adapter
    implementation 'com.github.yangchong211.YCRefreshView:EastAdapterLib:3.0.2'
  • 在布局中
    <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.屏幕滑动时分析

6.6 recyclerView相关博客

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.其他内容介绍

关于其他内容介绍

image

01.关于博客汇总链接

02.关于我的博客

03.勘误及提问

  • 如果有疑问或者发现错误,可以在相应的 issues 进行提问或勘误。如果喜欢或者有所启发,欢迎star,对作者也是一种鼓励。

04.关于LICENSE

Copyright 2017 yangchong211(github.com/yangchong211)

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

More Repositories

1

YCBlogs

技术博客笔记大汇总,包括Java基础,线程,并发,数据结构;Android技术博客等等;常用设计模式;常见的算法;网络协议知识点;部分flutter笔记;还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!转载请注明出处,谢谢!
6,403
star
2

YCAppTool

🔥🔥🔥 组件化综合案例,组件分层为:基础公共组件,功能组件,业务组件,主工程。每一层组件的建设,很详细的工程案例,很全面的一个组件化实践案例。一个超级综合案例!
Java
3,172
star
3

YCVideoPlayer

🔥🔥🔥 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer原生MediaPlayer可以自由切换内核;该播放器整体架构:播放器内核(自由切换) + 视频播放器 + 边播边缓存 + 高度定制播放器UI视图层。支持视频简单播放,列表播放,仿抖音滑动播放,自动切换播放,使用案例丰富,拓展性强。
Java
2,192
star
4

YCWebView

基于腾讯x5开源库,提高webView开发效率,大概要节约你百分之六十的时间成本。该案例支持处理js的交互逻辑且无耦合、同时暴露进度条加载进度、可以监听异常error状态、支持视频播放并且可以全频、支持加载word,xls,ppt,pdf,txt等文件文档、发短信、打电话、发邮件、打开文件操作上传图片、唤起原生App、支持webView页面截图、x5库为最新版本,功能强大。
Java
1,735
star
5

YCAndroidTool

用于项目测试,崩溃重启操作,崩溃记录日志【可以查看,分享】和重启【多种重启app方式】;网路拦截查看的工具小助手,拦截请求和响应数据,统计接口请求次数,流量消耗,以及统计网络链接/dns解析/request请求/respond响应等时间。提高开发效率……
Java
749
star
6

YCStateLayout

State switching, so that the View state switch and Activity completely separate. Using builder mode to freely add the required state View, can set data, data is empty, load data error, network error, load and other states, and support the layout of custom state. At present has been used in other formal projects, strong expansion!
Java
556
star
7

YCSlideLayout

购物商场商品详情页面自定义控件,模仿淘宝、京东、考拉等商品详情页分页加载的UI效果。可以嵌套RecyclerView、WebView、ViewPager、ScrollView等等。支持设置上拉分页加载动画效果……
Java
491
star
8

YCCustomText

自定义文本控件,支持富文本,包含两种状态:编辑状态和预览状态。编辑状态中,可以对插入本地或者网络图片,可以同时插入多张有序图片和删除图片,支持图文混排,并且可以对文字内容简单操作加粗字体,设置字体下划线,支持设置文字超链接(超链接支持跳转),已经用于多个实际项目中……
Java
479
star
9

YCUpdateApp

轻量级版本更新弹窗,弹窗上支持更新进度条,可以设置普通更新或者强制更新。解决8.0以上通知栏不显示问题,解决7.0以上安装apk异常,下载完成则会自动提示安装;下载异常,失败,错误等状态,支持重启下载任务;还支持自定义下载路径。代码量少,调用简单……
Java
446
star
10

YCCaptureTool

App综合防抓包实践,关闭代理,设置配置文件;设置单向认证或双向认证;对数据加密和解密;sign签名参数;防止xposed,root,va挂载等操作。 比较通用全面的防抓包技术方案!
Java
421
star
11

YCScrollPager

仿抖音,快手,短视频,竖直方向,一次滚动一个页面的封装库。目前支持ViewPager做法,也支持RecyclerView做法……使用ViewPager则只是修改滑动速率,以及滚动翻页过渡时间;使用recyclerView打造丝滑切换视频的功能,更多内容可以看demo
Java
376
star
12

YCNotification

通知栏封装库,强大的通知栏工具类,链式编程调用,解决了8.0以上通知栏不显示问题,支持多种不同的使用场景,兼容老版本。还有自定义通知栏view,可高度定制布局……
Java
376
star
13

YCDialog

自定义弹窗,其中包括:自定义Toast;自定义dialog控件;自定义DialogFragment弹窗;自定义PopupWindow弹窗;还有自定义Snackbar等等;简单便用。目前已经用于多个正式项目中。
Java
359
star
14

YCStudyCpp

🔥🔥🔥 c++学习案例,系统学习,c++教程,基础案例,数据类型,变量和常量,运算符,表达式,判断和循环,函数,模版函数,指针,引用,数组和容器,IO输入和输出,结构和类,继承和派生,多线程,并发,线程安全锁,内存分配,堆和栈,异常,STL标准模版,预处理器,信号处理,程序调试,网络通信,综合案例等等
C++
353
star
15

YCStatusBar

关于状态栏方案总结案例,适合于绝大多数的使用场景……同时,兼容了小米,魅族等手机状态栏字体颜色设置失效问题。已经用于实际项目投资界,新芽,沙丘大学等APP,一键集成并使用!支持单Activity多Fragment动态修改状态栏颜色,入侵性低,一行代码即可实现你需要的需求
Java
313
star
16

YCJniHelper

JNI学习案例,通过简单的案例快速入门jni开发。JNI基础语法介绍,so库生成打包和反编译,Java和C/C++相关调用案例
Java
266
star
17

YCFlutterUtils

Flutter Utils 全网最齐全的工具类。包含bus,颜色,日期,文件,json,log,sp,加解密,num,图片,网络,正则,验证,路由,文本,时间,spi,计时器,拓展类,编解码,发射,异常,字节转化,解析等等工具类。
Dart
245
star
18

YCThreadPool

轻量级简易线程池库,轻量级线程池异步库,支持线程执行过程中状态回调监测(包含成功,失败,异常等多种状态);支持创建异步任务,可以设置线程的名称,延迟执行时间,线程优先级,回调callback等;可以根据自己需要创建自己需要的线程池;线程异常时,可以打印异常日志,避免崩溃。
Java
224
star
19

YCCommonLib

组件化开发中基础公共库,activity栈管理;fragment周期监听;Lru缓存库;反射库;分区存储;Log日志打印和存储;通用缓存库(支持sp,mmkv,lru,disk,fastsp等多种存储方式切换);App重启;通用全面的工具类Utils;通用基类fragment,adpater,activity等简单封装;intent内容打印到控制台库;通用基础接口
Java
191
star
20

YCWidgetLib

自定义控件,其中包含自定义折叠布局,拓展性强使用简单;万能自定义红点控件,充分解耦合接入方便;多种方案实现阴影效果库;自定义view和viewGroup圆角控件,彻底解决圆角问题等
Java
186
star
21

YCWalleHelper

瓦力多渠道打包的Python脚本测试工具,通过该自动化脚本,自需要run一下或者命令行运行脚本即可实现美团瓦力多渠道打包,打包速度很快。配置信息十分简单,代码中已经注释十分详细。可以自定义输出文件路径,可以修改多渠道配置信息,简单实用。
Tcl
133
star
22

YCBannerView

轮播图,支持多种自定义属性,可以设置轮播红点或者轮播数字,支持设置引导页。可以根据不同使用场景,可以选择无限循环,静态管理或者动态管理adapter,还可以设置暂停和开始轮播。后期添加了RecyclerView轮播图,同时自定义多种类型SnapHelper,卡片滑动流畅,目前已经用于多个正式项目中!!
Java
106
star
23

YCLeetcode

组件之间的通信,很友好起到隔离效果,接口+实现类,使用注解生成代码方式,无需手动注册,将使用步骤简单化,支持组件间以暴露接口提供服务的方式进行通信。
Java
76
star
24

YCStudyWeb

Web学习案例
JavaScript
71
star
25

YCToolLib

通用工具库组件,包括前后台判断,拦截器时间,心跳轮询库,Task任务库,二维码扫码库,转场动画库,通用TTS音频播放库,国际化locale库等等
Java
66
star
26

YCServerLib

gRPC学习案例,使用gRPC作为网络方案可以带来高效性、跨平台和语言、可靠性、易于使用和可扩展性等收益。同时可以减少手动编写代码的工作量,提高开发效率。
Java
51
star
27

YCStudyC

系统性学习C编程,变量,数据类型,循环,选择,输入和输出,数组和容器,函数,结构体,指针,预处理,文件操作,调试等。练习多个完整小项目:学生管理系统,贪吃蛇,万年历,推箱子,五子棋。是入手学习C的练习完整项目
C
49
star
28

YCDesignHelper

注解学习小案例,比较系统性学习注解并且应用实践。简单应用了运行期注解,通过注解实现了setContentView功能;简单应用了编译器注解,通过注解实现了防暴力点击的功能,同时支持设置时间间隔;使用注解替代枚举;使用注解一步步搭建简单路由案例。结合相应的博客,在来一些小案例,从此应该对注解有更加深入的理解……
Java
45
star
29

YCDesignBlog

设计模式,创建型设计模式,结构型设计模式,行为型设计模式,面向对象设计原则,六大设计原则,面向对象设计思想,项目架构演进。持续迭代笔记和完善案例,打造全网系统高质量的设计模式笔记!
Java
44
star
30

YCTimerHelper

倒计时工具,分别使用了handler,自定义CountDownTimer,Timer和TimerTask,chronometer控件,和属性动画实现倒计时的功能。封装CountDownTimer倒计时器【在原有基础上增加了暂停和恢复倒计时功能】,解决了倒计时无法到0和从最大值开始bug
Java
13
star
31

YCJavaBlog

Java高级进阶专栏博客,数据类型原理,泛型设计思想,面向对象,继承,封装,io流,序列化,拷贝,高效读写,反射,注解,spi机制,异常,四种引用,线程原理,线程通信,线程池设计思想,线程并发优化,上下文切换原理,CAS,锁的设计和原理,类加载,对象布局,代码攻击,内存模型,即时编译,内存回收机制,性能调优,集合设计思想
Java
7
star
32

YCComputerBlog

计算机基础博客,计算机组成原理,存储器的设计,局部性原理,地址映射,CPU处理器用途,指令架构,CPU性能,缓存一致性,Cache,MESI协议,伪共享,CPU三级缓存设计思想,输入和输出,总线系统设计,指令编程,程序如何运行,内存存储设计,物理内存和虚拟内存,共享内存设计,计算机二进制的由来,异常处理,IO流操作
4
star
33

YCSplashSdk

打开app启动页sdk,支持图片广告,也支持视频
3
star
34

YCUniApp

uni开发的项目,由于公司项目做混合开发,因此边学边做。基础入门级的案例分析,近期学习更新中
Vue
3
star
35

YCPluginTool

Plugin插件学习工具
2
star
36

YCAndroidBlog

Android技术专栏
1
star
37

yangchong211

1
star