JDRefresh 轻简下拉刷新框架

JDRefresh是一款轻简的下拉刷新框架,支持自定义下拉刷新头、上拉加载布局等功能。本文详细介绍JDRefresh的特性及使用方法,包括框架引入、自定义刷新头、添加HeaderView等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDRefresh 轻简下拉刷新框架

现在网上有很多 RecyclerView 相关框架,我用过的
BaseRecyclerViewAdapterHelperLRecyclerViewSmartRefreshLayout 等等
这几个主流框架基本上都已经非常成熟,而且在github的star量也很多,有兴趣的同学可以关注学习一下。

可能有人会问,既然网上有这么多的开源框架,为什么还写 JDRefresh。
首先对我来说,自己撸一个框架,是一个不断学习的过程。
而且在这个过程中,你会遇到很多之前你没有遇见过的错误,
对代码的理解也会更深一层,是一个很好的知识技能提升的机会。
因此,心生自撸框架的想法,那么就有了今天的主角:JDRefresh.

功能点
  • 支持设置下拉刷新头,上拉加载布局
  • 支持上拉加载
  • 支持添加 HeaderView
  • 支持添加 FooterView
  • 支持自动刷新、自动上拉加载
  • 支持多布局
  • 支持添加 item 点击事件
  • 上拉加载失败,支持点击重新加载
  • 侧滑删除
jdRefresh.fixedSize()
                .layoutManagerLinear()
                .dragRate(3.5f)
                .refreshEnabled(true)
                .loadMoreEnabled(true)
                .refreshHeader(refreshHeader)
                .loadMoreFooter(loadMoreFooter)
                .headerView(headerView)
                .footerView(footerView)
                .refreshListener(this)
                .loadMoreListener(this)
                .autoLoadMoreEnabled(true)
                .autoRefresh().adapter(mAdapter);
复制代码

是不是感觉很代码很清爽?那么接下来看一下具体如何使用。

框架引入

如何使用?

  1. Add it in your root build.gradle at the end of repositories:
allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
复制代码
  1. Add the dependency
dependencies {
	   implementation 'com.github.JD-CP:JDRefresh:1.0.0-beta'
	}
复制代码

自定义下拉刷新头

可随心所欲配置你想实现的下拉刷新头!!!

示例代码:

public class ExsampleRefreshHeader extends RefreshHeader {
    public ExsampleRefreshHeader(Context context) {
        super(context);
    }
    
    /**
    * 初始化 Header,具体代码可参考 DefaultRefreshHeader
    */
    @Override
    protected void initHeader() {
        
    }
    
    @Override
    public void stateChanged(int state) {
        
    }
    
    @Override
    public View getHeaderView() {
        return this;
    }
}

jdRefresh.setRefreshHeader(new ExsampleRefreshHeader(this));

复制代码
自定义上拉加载布局
public class ExsampleLoadMoreFooter extends LoadMoreFooter {
    public ExsampleLoadMoreFooter(Context context) {
        super(context);
    }
    
    /**
    * 初始化 Header,具体代码可参考 DefaultRefreshHeader
    */
    @Override
    protected void initFooter() {
        
    }
    
    @Override
    public void stateChanged(int state) {
        
    }
    
    @Override
    public View getFooterView() {
        return this;
    }
}

jdRefresh.setLoadMoreFooter(new ExsampleLoadMoreFooter(this));

复制代码
添加 or 删除 HeaderView、FooterView
// 添加
jdRefresh.headerView(header);
jdRefresh.footerView(footer);

// 删除
jdRefresh.headerViewRemoved(header);
jdRefresh.footerViewRemoved(footer);
复制代码
设置下拉刷新监听器、上拉加载监听器
// 方式 1  此种已不推荐使用,看 方式 2
jdRefresh.setRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                // TODO 
            }
        });
jdRefresh.setLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void loadMore() {
                // TODO
            }
        });
 // 方式 2
 jdRefresh.refreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                // TODO 
            }
        });
jdRefresh.loadMoreListener(new OnLoadMoreListener() {
            @Override
            public void loadMore() {
                // TODO
            }
        });
复制代码
设置进入页面自动刷新
jdRefresh.autoRefresh();
复制代码
上拉加载

默认支持上拉加载,若禁用上拉加载,可以配置:

jdRefresh.loadMoreEnabled(false);
复制代码

默认支持自动上拉加载,若禁用,可以配置:

// true:开启 false:关闭 默认为 true
jdRefresh.autoLoadMoreEnabled(boolean isAutoLoadMore);
复制代码

支持设置上拉加载布局高度:

jdRefresh.loadMoreFooterHeight(int height);
复制代码

上拉加载完成(当前页数据加载完成,下一页还有数据可加载):

// 方式 1:
jdRefresh.loadMoreCompleted();
// 方式 2:
jdRefresh.noMoreData(false);
复制代码

上拉加载结束(没有下一页,也就是说下一页无数据可加载):

jdRefresh.noMoreData(true);
复制代码

加载失败配置(出现加载失败,点击会出重新加载,无需配置点击事件):

jdRefresh.loadMoreFail();
复制代码
多布局列表加载

注意:实体类必须要实现 MultiItemEntity

public class MultiSample implements MultiItemEntity {

    public static final int TYPE_NORMAL = 101;
    public static final int TYPE_OTHER = 102;

    private int type;

    public int getType() {
        return type;
    }
    
    public int setType(int type) {
        this.type = type;
    }

    @Override
    public int getItemType() {
        return type;
    }
}
复制代码

然后在 adapter 构造方法中,根据 type 添加相对应的 layout

public class SampleMultiAdapter extends JDMultiItemAdapter<MultiSample> {

    public SampleMultiAdapter(Context context, List<MultiSample> dataList) {
        super(context, dataList);
        addItemType(MultiSample.TYPE_NORMAL, R.layout.item_multi_normal);
        addItemType(MultiSample.TYPE_OTHER, R.layout.item_multi_other);
    }

    @Override
    protected void bind(JDViewHolder holder, MultiSample item, int position) {
        switch (item.getItemType()) {
            case MultiSample.TYPE_NORMAL:
                // 赋值操作
                break;
            case MultiSample.TYPE_OTHER:
                // 赋值操作
                break;
        }
    }
}
复制代码
添加 item 点击事件
// item 点击事件
mAdapter.setOnItemClickListener(new JDAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(JDAdapter adapter, View view, int position) {
                
            }
        });
        
// item child 点击事件
mAdapter.setOnItemChildClickListener(new JDAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(JDAdapter adapter, View view, int position) {
                
            }
        });
复制代码
设置 LayoutManager

之前设置 LayoutManager 需要:

LinearLayoutManager manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
复制代码

现在只需:

jdRefresh.layoutManagerLinear();
复制代码

还有:

jdRefresh.layoutManagerLinear(orientation, reverseLayout);
jdRefresh.layoutManagerGrid(spanCount);
jdRefresh.layoutManagerGrid(spanCount, orientation, reverseLayout);
jdRefresh.layoutManagerStaggeredGrid(spanCount, orientation);
复制代码
侧滑删除

布局文件编写:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:background="#ffffff">

    <com.jd.library.ui.SwipeDeleteMenu
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="12dp"
            android:paddingLeft="15dp"
            android:paddingTop="12dp">

            <TextView
                android:layout_width="80dp"
                android:layout_height="50dp"
                android:background="#575757" />

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

                <TextView
                    android:id="@+id/item_type"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="JDRefresh - Normal - No1"
                    android:textSize="13sp" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="bottom">

                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:gravity="bottom"
                        android:text="JD厂牌" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:gravity="bottom"
                        android:text="2020-08-08" />

                </LinearLayout>

            </LinearLayout>

        </LinearLayout>

        <Button
            android:id="@+id/btnDelete"
            android:layout_width="60dp"
            android:layout_height="match_parent"
            android:background="#ff4a57"
            android:text="删除"
            android:textColor="@android:color/white" />

    </com.jd.library.ui.SwipeDeleteMenu>

</LinearLayout>
复制代码

然后在 adapter 中绑定事件:

@Override
    protected void bind(JDViewHolder holder, String item, int position) {
        holder.text(R.id.item_type, item)
                .clickListener(R.id.btnDelete);
    }
复制代码

然后实现 itemChildClick 点击事件:

mAdapter.setOnItemChildClickListener(new JDAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(JDAdapter adapter, View view, int position) {
                adapter.removeItem(position);
            }
        });
复制代码

侧滑删除具体的实现过程,我已上传到博客。 点击下方可以进行查看: SwipeDeleteMenu

目前 JDRefresh 已实现上述功能,接下来还会拓展更多功能,
比如置顶(仿微信),添加拖拽等等。 当然,这里面也有诸多不足,希望各位网友提出。
这个项目也会持续不断的维护下去。

更新记录
  • 1.2.6-beta
    更新下拉刷新样式

  • 1.2.5-beta

    • HeaderView、FooterView 添加逻辑优化
    • HeaderView、FooterView 删除功能添加
    • JDRefresh 类代码优化以及部分 bug 修复
  • 1.2.0-beta
    自定义仿微信看一看下拉刷新动画

  • 1.1.0-beta:
    增加 list item 侧滑删除。

THANKS

BaseRecyclerViewAdapterHelper
LRecyclerView
SmartRefreshLayout

联系方式

  • 有问题可以添加我微信,我很乐意帮您解决问题,也很希望能与您一起探讨学习

转载于:https://juejin.im/post/5b20dc5f5188257d9f24d44c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值