SkillAgentSearch skills...

YCRefreshView

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

Install / Use

/learn @yangchong211/YCRefreshView
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

目录介绍

  • 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<T>
    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>,其中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) 
    
View on GitHub
GitHub Stars454
CategoryDevelopment
Updated14d ago
Forks86

Languages

Java

Security Score

95/100

Audited on Mar 17, 2026

No findings