也许大家还在使用曾经最常用的第三方下拉刷新控件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