SmartRefreshLayout 快速集成和经典刷新控件+自定义Header和Footer(和Head类似)

SmartRefreshLayout 快速集成和经典刷新控件+自定义Header和Footer

github地址: 刷新控件地址

快速集成:

1. 对应的model的gradle中进行依赖:

implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'  //1.0.5及以前版本的老用户升级需谨慎,API改动过大
implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0'  //没有使用特殊Header,可以不加这行

注意区别于AndroidX:

如果使用 AndroidX 在 gradle.properties 中添加

android.useAndroidX=true
android.enableJetifier=true

2. 在布局中集成

<com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never"
        android:background="#fff" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>

3.在java文件中的刷新设置

初始化控件:

RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
    @Override
    public void onRefresh(RefreshLayout refreshlayout) {
    // refreshLayout.finishRefresh();  简单的设置刷新完成
        refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
        //重新刷新的逻辑代码
    }
});
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
    @Override
    public void onLoadMore(RefreshLayout refreshlayout) {
    // refreshLayout.finishLoadMore();  //  简单的设置加载更多完成
        refreshlayout.finishLoadMore(2000/*,false*/);//传入false表示加载失败
        //  加载更多的逻辑
    }
});

其他需求; 例如设置经典的刷新控件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AYrLGohu-1570788044728)(https://ws1.sinaimg.cn/large/e25f3775ly1g7u8cq6ehij20u01hcadj.jpg)]

简单的设置(好几种设置方法,我们使用xml设置的)

在原先的xml布局中,添加head和foot就OK了.

<com.scwang.smartrefresh.layout.SmartRefreshLayout
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/text_time">

    <com.scwang.smartrefresh.layout.header.ClassicsHeader
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </com.scwang.smartrefresh.layout.header.ClassicsHeader>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/bdtv_fragment_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">


    </android.support.v7.widget.RecyclerView>
    <com.scwang.smartrefresh.layout.footer.ClassicsFooter
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
    </com.scwang.smartrefresh.layout.footer.ClassicsFooter>
</com.scwang.smartrefresh.layout.SmartRefreshLayout>

现在需求是使用自定义的head和foot:

实现 Header 和 Footer 时,继承 InternalAbstract 的话可以少写很多接口方法

堃堃5love:
刷新head R.layout.layout_ptr_header

<?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="wrap_content"
    android:orientation="horizontal"
    android:gravity="center">

    <ProgressBar
        android:id="@+id/progress_bar"
        style="@style/Widget.AppCompat.ProgressBar"
        android:layout_width="12dp"
        android:layout_height="12dp"
        android:visibility="gone"
        android:layout_gravity="center_horizontal" />

    <ImageView
        android:id="@+id/refresh_head"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/refresh_anim"
        android:contentDescription="@null"/>

    <TextView
        android:id="@+id/tv_ptr_header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:gravity="center_vertical"
        android:textColor="#333"
        android:textSize="12dp" />
</LinearLayout>

堃堃5love:
加载更多: R.layout.layout_load_more

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:gravity="center"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:layout_height="wrap_content">

    <ProgressBar
        android:id="@+id/progress"
        style="@style/MyProgressBar"
        android:layout_width="16dp"
        android:layout_height="16dp"/>

    <TextView
        android:id="@+id/tv_loadmore"
        android:text="加载更多"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:textColor="#333"
        android:textSize="13dp" />

</LinearLayout>

创建自定义Head,后续会将这个类上传,现在有一个问题是下拉的距离太短

设置下拉刷新的高度:

// 设置下拉刷新的Head高度
refreshLayout.setHeaderHeight(200);

附件之:

自己的下拉刷新:

/**
 * PACKAGE_NAME: cn.com.enorth.easymakeapp.view.customsmartview
 * PROJECT_NAME:learnbaodi
 * 创建日期 :2019/10/11
 * 创建时间: 15/49
 * author  kunkun5love
 * 说明: smartRefrush中自定义的head 需要实现RefreshHeader
 ***/
public class CustomSmartRefrushHead extends LinearLayout implements RefreshHeader {

    private View mRefrushSmartHeadView;
    private ProgressBar mRefrush_smart_head_pg;
    private ImageView mRefrush_smart_head_iv;
    private TextView mRefrush_smart_head_tv;
    private AnimationDrawable mAnimationDrawable;

    /**
     * 我们这边写好了  两个布局堃堃5love:
     * 刷新head  R.layout.layout_ptr_header
     * 

* 堃堃5love: * 加载更多: R.layout.layout_load_more * * @param context */ public CustomSmartRefrushHead(Context context) { super(context); initRefrushView(context); } public CustomSmartRefrushHead(Context context, AttributeSet attrs) { super(context, attrs); initRefrushView(context); } public CustomSmartRefrushHead(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initRefrushView(context); } /** * 打气一个view,并进行初始化 * * @param context */ private void initRefrushView(Context context) { // 设置居中 setGravity(Gravity.CENTER); mRefrushSmartHeadView = LayoutInflater.from(context).inflate(R.layout.layout_ptr_header, null); addView(mRefrushSmartHeadView); mRefrush_smart_head_pg = mRefrushSmartHeadView.findViewById(R.id.progress_bar); mRefrush_smart_head_iv = mRefrushSmartHeadView.findViewById(R.id.refresh_head); mRefrush_smart_head_tv = mRefrushSmartHeadView.findViewById(R.id.tv_ptr_header); //先设置图片的开始动画 设置的时候src直接设置的 animation mRefrush_smart_head_iv.getDrawable(); mAnimationDrawable = (AnimationDrawable) mRefrush_smart_head_iv.getDrawable(); } // 下面的都是RefreshHeader继承的方法 start /** * 获取真实视图(必须返回,不能为null) 当前的head就是一个view * * @return */ @NonNull @Override public View getView() { return this; } /** * 获取变换方式(必须指定一个:平移、拉伸、固定、全屏) 我们类似于经典刷新 选择平移 * * @return */ @NonNull @Override public SpinnerStyle getSpinnerStyle() { return SpinnerStyle.Translate;//指定为平移,不能null; } /** * 设置主题颜色 (如果自定义的Header没有注意颜色,本方法可以什么都不处理) * * @param colors 对应Xml中配置的 srlPrimaryColor srlAccentColor */ @Override public void setPrimaryColors(int... colors) { } /** * 尺寸定义初始化完成 (如果高度不改变(代码修改:setHeader),只调用一次, 在RefreshLayout#onMeasure中调用) * * @param kernel RefreshKernel 核心接口(用于完成高级Header功能) * @param height HeaderHeight or FooterHeight * @param maxDragHeight 最大拖动高度 */ @Override public void onInitialized(@NonNull RefreshKernel kernel, int height, int maxDragHeight) { } /** * 手指拖动下拉(会连续多次调用,用于实时控制动画关键帧) * * @param percent 下拉的百分比 值 = offset/headerHeight (0 - percent - (headerHeight+maxDragHeight) / headerHeight ) * @param offset 下拉的像素偏移量 0 - offset - (headerHeight+maxDragHeight) * @param height Header的高度 * @param maxDragHeight 最大拖动高度 */ @Override public void onMoving(boolean isDragging, float percent, int offset, int height, int maxDragHeight) { } @Override public void onReleased(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) { } /** * 开始动画(开始刷新或者开始加载动画) * * @param refreshLayout RefreshLayout * @param height HeaderHeight or FooterHeight * @param maxDragHeight 最大拖动高度 */ @Override public void onStartAnimator(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) { mAnimationDrawable.start(); // 设置下拉刷新 mRefrush_smart_head_tv.setText("下拉刷新"); } /** * 动画结束 * * @param refreshLayout RefreshLayout * @param success 数据是否成功刷新或加载 * @return 完成动画所需时间 如果返回 Integer.MAX_VALUE 将取消本次完成事件,继续保持原有状态 */ @Override public int onFinish(@NonNull RefreshLayout refreshLayout, boolean success) { // 图片动画定义 mAnimationDrawable.stop(); if (success) { mRefrush_smart_head_tv.setText("刷新成功"); } else { mRefrush_smart_head_tv.setText("刷新失败"); } return 500; } @Override public void onHorizontalDrag(float percentX, int offsetX, int offsetMax) { } @Override public boolean isSupportHorizontalDrag() { return false; } /** * 不同的状态控制内部控件的显示和旋转 * * @param refreshLayout * @param oldState * @param newState */ @Override public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) { switch (newState){ case None: case ReleaseToRefresh: //下拉将要释放开始刷新 mRefrush_smart_head_tv.setText("释放刷新"); break; case PullDownToRefresh: // 开始下拉 mRefrush_smart_head_tv.setText("下拉开始刷新"); break; case Refreshing: // 正在刷新 mRefrush_smart_head_tv.setText("正在刷新"); break; } } // 下面的都是RefreshHeader继承的方法 end }

展示效果图:

art_head_tv.setText(“释放刷新”);
break;
case PullDownToRefresh: // 开始下拉
mRefrush_smart_head_tv.setText(“下拉开始刷新”);
break;
case Refreshing: // 正在刷新
mRefrush_smart_head_tv.setText(“正在刷新”);

            break;

    }
}

//  下面的都是RefreshHeader继承的方法  end

}




展示效果图:

![展示效果图.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly93czEuc2luYWltZy5jbi9tdzY5MC9lMjVmMzc3NWx5MWc3dWV2Z2JycHFqMjB1MDFoY3RpeC5qcGc?x-oss-process=image/format,png)

你可能感兴趣的:(Android)