你还在用第三方开源下拉刷新控件吗?试试google自带的下拉刷新控件SwipeRefreshLayout

也许大家还在使用曾经最常用的第三方下拉刷新控件pulltorefresh,当然这个控件还是挺好用的,但是或多或少存在一些不足还有需要添加第三方库,个人感觉不是很方便,于是乎我想到使用Google自带的下拉刷新控件SwipeRefreshLayout,这个控件使用简单,操作方便,下面我就简单介绍一下这个控件的使用方法

1 控件简介
SwipeRefreshLayout是Google官方推出的一款下拉刷新组件,位于v4兼容包下,android.support.v4.widget.SwipeRefreshLayout,Support Library 必须19.1以上。使用起来很简单,只要在需要刷新的控件最外层加上SwipeRefreshLayout,它的子孩子必须是可滚动的view,如ScrollView、GridView、ListView和RecyclerView等等 为了简单 我就拿listview作为例子
2 布局中使用
activity_main.xml

 <android.support.v4.widget.SwipeRefreshLayout
   android:id="@+id/id_srl"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
       <ListView
           android:id="@+id/id_list"
           android:layout_width="match_parent"
           android:layout_height="match_parent"/>
  </android.support.v4.widget.SwipeRefreshLayout>
listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/id_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:textColor="#333333"
        android:padding="10dp"
        />

</LinearLayout>

3 代码中使用
ListView和GridView是我们常用的控件,我们项目中会经常用到,但是每次都需要设置数据适配器,每次都重写那四个方法看起来有点繁琐,于是乎我在参考了一些大牛的博客后,自己封装了一个针对ListView和GridView通用的数据适配器和ViewHolder类,大牛们封装的太厉害,我个人觉得封装过度也未必是好事,能一定程度简化 代码然后通俗易懂是最好的。
(1) 首先看我的通用的数据适配器 这个很简单 我就不过多解释了

    public abstract class CommonAdapter<T> extends BaseAdapter{

        protected Context mContext;
        protected List<T> mDatas;
        public CommonAdapter(Context context,List<T> datas){
            mContext = context;
            mDatas = datas;
        }

        @Override
        public int getCount() {
            return mDatas.size();
        }

        @Override
        public Object getItem(int position) {
            return mDatas.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public abstract View getView(int position, View convertView, ViewGroup parent);
    }
(2) 然后这个是通用的ViewHolder 这个才是关键 这个类里面可以自己加很多方法 为的就是简化代码 当然我这里只是简单的加了两三个方法 可以自行扩展
public class CommonViewHolder {

    private View mConvertView;         //加载布局文件返回的View对象
    private final SparseArray<View> mViews;    //SparseArray其实就是map集合 但是键必须是Integer而且比map集合的效率要高
    private Context mContext;    //上下文对象
    private CommonViewHolder(Context context, int layoutId){  //构造函数传入上下文 布局文件id
        mViews = new SparseArray();
        mContext = context;
        mConvertView = View.inflate(context,layoutId,null);
        mConvertView.setTag(this);
    }

    public static CommonViewHolder getInstance(Context context, View convertView, int layoutId){

        if(convertView==null) {
            return new CommonViewHolder(context,layoutId);
        }
        return (CommonViewHolder) convertView.getTag();
    }

    //获取加载的布局文件返回的View对象
    public View getConvertView() {
        return mConvertView;
    }

    /**
     * 通过控件ID获取控件
     * 这个是核心方法
     */
    public <T extends View> T getView(int viewId){
        View view = mViews.get(viewId);
       if(view==null){    //如果map集合中没有找到控件 通过布局文件的view对象去查找控件 并且把它加入到集合中
           view = mConvertView.findViewById(viewId);
           mViews.put(viewId,view);
       }
        return (T) view;
    }

    /**
     * 为TextView设置字符串
     *
     * @param viewId
     * @param text
     * @return
     */
    public CommonViewHolder setText(int viewId, String text)
    {
        TextView view = getView(viewId);
        view.setText(text);
        return this;
    }

    /**
     * 为ImageView设置图片
     */
    public CommonViewHolder setImageResource(int viewId, int resId){

        ImageView imageView = getView(viewId);
        imageView.setImageResource(resId);
        return this;
    }

    /**
     * 为ImageView设置图片
     */
    public CommonViewHolder setImageBitmap(int viewId, Bitmap bitmap){

        ImageView imageView = getView(viewId);
        imageView.setImageBitmap(bitmap);
        return this;
    }

}

(3) 接下来就是给listview设置数据适配器 当然你可能会有疑问 不就展示一个文本数据吗 为何要搞这么麻烦 通用的数据的数据适配器什么的都出来了 对于这个例子 确实是写麻烦了 不过对于以后的项目开发确实是能减少不少代码 下面这个非常简单就是给listview设置数据适配器

//1 添加数据
  for (int i = 0; i < 8; i++) {
      mStringList.add("这是第 " + i + " 数据");
  }
  //2 设置数据适配器
  mListView.setAdapter(mAdapter = new MyAdapter(this, mStringList));

(4) 接下来步入正题 开始讲讲下拉刷新SwipeRefreshLayout 其实非常简单

 //1 设置进度条的颜色主题,最多能设置四种 加载颜色是循环播放的,只要没有完成刷新就会一直循环
  mSwipeRefreshLayout.setColorSchemeColors(
          Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW
  );
  //2 设置圆圈大小
  mSwipeRefreshLayout.setSize(DensityUtils.dip2Px(this,50));
  //3 设置圆圈背景颜色  
 mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(Color.BLACK);
  //4 设置下拉刷新的监听
  mSwipeRefreshLayout.setOnRefreshListener(this);

(5) 实现下拉刷新接口 复写未实现的方法 实现下拉刷新
实现 SwipeRefreshLayout.OnRefreshListener 复写onRefresh()方法

private int s = 0;
@Override
public void onRefresh() {

    //模拟一个延时操作
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            mStringList.add("新添加的第 "+(++s)+" 数据");
            mSwipeRefreshLayout.setRefreshing(false); //刷新完成隐藏进度条
            if(mAdapter!=null)
                mAdapter.notifyDataSetChanged(); //千万别忘记刷新数据适配器
        }
    },4000); //设置4秒钟 是为了正好看到4种颜色的进度条
}

(6) 到此为止 Google官方的下拉刷新控件就介绍完了 感觉好方便好简单。
4 常用方法介绍

 mSwipeRefreshLayout.setColorSchemeColors(int... colors)  //设置进度条颜色主题

 mSwipeRefreshLayout.setDistanceToTriggerSync(int dis) //设置手指下拉多少距离开始下拉刷新

 mSwipeRefreshLayout.setSize(int size) //设置进度条圆圈的大小

 mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(int color)  //设置下拉圆圈背景颜色

 mSwipeRefreshLayout.setRefreshing(boolean refreshing) //设置显示或隐藏进度条

 mSwipeRefreshLayout.isRefreshing()  //判断进度条是否在刷新

 mSwipeRefreshLayout.setProgressViewOffset(boolean scale, int start, int end)  //scale为true则进度条执行缩放动画,设置进度条下拉的起始位置和能下拉的最大高度

 mSwipeRefreshLayout.setProgressViewEndTarget(boolean scale, int end) //scale为true则进度条执行缩放动画,设置进度条能下拉的最大高度

 mSwipeRefreshLayout.setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener) //设置下拉刷新监听事件

 mSwipeRefreshLayout.setNestedScrollingEnabled(boolean enabled)  //启用或禁用嵌套滚动视图

 mSwipeRefreshLayout.setEnabled(boolean enabled) //设置能否下拉刷新 true表示可以下拉刷新 否则不能

5 源代码下载
6 效果图展示
这里写图片描述
7 联系方式
QQ:1509815887
邮箱:zlc921022@163.com

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值