SwipeRefreshLayout

作者:ca88编程

个人主页演示德姆o下载

常用Api介绍

  • setColorSchemaResources(int...colorResIds)
    • 设置下拉进程条的水彩宗旨,参数为可变参数,必得是财富id。能够安装多样差别的水彩,每转一圈就呈现一种颜色。
  • setRefreshing(boolean)
    • 安装刷新状态,true运转刷新动漫,false关闭刷新动漫
  • setProgressBackgroundColorSchemaResources(int colorRes)
    • 安装下拉圆圈背景颜色
  • setOnRefreshListener(OnResfreshListener)
    • 安装监听器,监听下拉操作,并促成回调方法做一些刷新操作
  • setEnabled(boolean)
    • 参数为false时禁止使用下拉刷新
  • setSize(int)
    • 设置下拉圆圈大小,有SwipeRefreshLayout.LA奥迪Q5GE和SwipeRefreshLayout.DEFAULT二种
● setDistanceToTriggerSync(卡塔尔国;// 设置手指在显示屏下拉有个别间距会触发下拉刷新

一、SwipeRefreshLayout简介

  • 先看之下官方文书档案,原来就有了很详细的陈说了。

    图片 1官方文档表达

  • 此地自个儿再差不离解释一下:

    • 在竖直滑动时想要刷新页面能够用SwipeRefreshLayout来落到实处。它经过安装OnRefreshListener来监听分界面包车型客车滑行进而达成刷新。也能够通过有个别办法来设置SwipeRefreshLayout是不是能够刷新。如:setRefreshing,展开刷新动漫。setRefreshing,撤销刷新动画。setEnable下拉刷新将不可用。

    • 应用那一个布局要想达到刷新的目标,须要在此个布局里包裹能够滑动的子控件,如ListView等,并且必须要有三个子控件。

  • 介绍总计:使用SwipeRefreshLayout能够兑现下拉刷新,前提是布局里供给包裹一个方可滑动的子控件,然后在代码里设置OnRefreshListener设置监听,最终在监听里设置刷新时的数目取得就能够了。由于是新出来的事物,所以要想行使,先把support library的本子升级到19.1或更新。

给listview和recyclerview增加header和footer,大家平时常用的法子,犹如下三种:
xml文件:

Google官方下拉刷新控件

在App中由于荧屏的限制,供给运用相近ListView等控件,容纳并展现愈来愈多的数额给顾客。不过数量鲜明不是一层不改变的,须要天天更新,那就有了下拉刷新的操作。

首先次写这么多的稿子,大概写的非常不够易懂,见谅。

  • 介绍在此之前,先来看一下SwipeRefreshLayout达成的下拉刷新效率图。从图中得以见见,下拉到了必然的莫斯中国科学技术大学学才展销会开刷新,中度非常不够就能够回笼上去,正在刷新进度中,继续下拉没反应,表达刷新时屏蔽掉了下拉事件。

    图片 2上拉刷新作用图

1.自定义listview和recyclerview.增多头和尾
2.运用第三方框架PullToRefresh举办加多头和尾
3.采纳Google流行推出的控件SwipeRefreshLayout,上面我们就来上课一下怎么使用Google新型的特色开展增添头和尾
该控件有一个弱点:自带功能中并未有增添叫结构加载更加多的方法.
上图:

参考

SwipeRefreshLayout

SuperSwipeRefreshLayout

再往下看一下 重载的四个参数的 setRefreshing(boolean refreshing, final boolean notify卡塔尔国 能够安装mNotify那个值 但是这些办法未有揭露 而唯有finishSpinner(State of Qatar方法调用了setRefreshing(boolean refreshing, final boolean notify),並且独有当SwipeRefreshLayout触发本身ontouchevent(卡塔尔方法才会调用finishSpinner(卡塔尔方法。所以onRefresh(State of Qatar的注释的法则就在那处

<pre>
private void setRefreshing(boolean refreshing, final boolean notify) {
if (mRefreshing != refreshing) {
mNotify = notify;
ensureTarget();
mRefreshing = refreshing;
if (mRefreshing) {
animateOffsetToCorrectPosition(mCurrentTargetOffsetTop, mRefreshListener);
} else {
startScaleDownAnimation(mRefreshListener);
}
}
}
</pre>

图片 3

Paste_Image.png

二、SwipeRefreshLayout主要方法介绍

翻看官方的文书档案,能够看出方法有这多少个,这里只介绍八个平时使用的章程。

  • isRefreshing()

    • 判断当前之处是还是不是是刷新状态。
  • setColorSchemeResources(int... colorResIds)

    • 设置下拉进程条的水彩主旨,参数为可变参数,况且是财富id,能够安装各个分化的水彩,每转一圈就展现一种颜色。
  • setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener)

    • 设置监听,要求重写onRefresh(State of Qatar方法,顶上部分下拉时会调用这么些办法,在其间完结央求数据的逻辑,设置下拉进度条消失等等。
  • setProgressBackgroundColorSchemeResource(int colorRes)

    • 设置下拉进程条的背景颜色,默许清水蓝。
  • setRefreshing(boolean refreshing)

    • 安装刷新状态,true表示正在刷新,false表示撤销刷新。

图片 4

ChildView不是可滑动控件

当第二个直接子View不是可滑动控件,SwipeRefreshLayout的机能很差。大约能够掌握为当直接子View不是ListView等可滑动控件,不会影响可滑动控件的上拉(也正是翻开上面被屏蔽的item卡塔尔(قطر‎。原因是上海滑稽剧团事件会最后传递给可滑动控件,何况花费该事件。相反若是想下拉刷新,就能出现难点。由于此事SwipeRefreshLayout监听的是第四个子View(非可滑动控件State of Qatar,下拉事变不能被第一身形View费用造成SwipeRefreshLayout间接堵住事件,本身管理(那个时候的功效宛如ListVIew尚未曾下拉到最顶端,就起身了SwipeRefreshLayout下拉刷新的卡通片State of Qatar。效果如下:

图片 5

下拉刷新无效果.gif

并且还开采,设置的快慢转变颜色(setColorSchemaRespurces卡塔尔国无坚守。

● setRefreshing(卡塔尔国;//设置控件是或不是开展刷新

本文入眼介绍了SwipeRefreshLayout的选择和自定View世襲SwipeRefreshLayout增添上拉加载越来越多的效能。

只须求充足下拉加载更加多以来,直接利用原生的控件就能够:
上代码:
privateListViewlv;
privateArrayListlist=newArrayList<>();
privateListviewAdaptermAdapter;
privateSwipeRefreshLayoutswipe;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv= (ListView) findViewById(R.id.lv_listview);
swipe= (SwipeRefreshLayout) findViewById(R.id.swipe);
init();
//设置下拉刷新的颜色
swipe.setProgressBackgroundColorSchemeResource(android.R.color.holo_red_light);
//下拉时触发SwipeRefreshLayout的下推动漫,动漫完结之后就能够回调那个主意
swipe.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener() {
@Override
public voidonRefresh() {
//初叶刷新,设置当前为刷新状态
//swipeRefreshLayout.setRefreshing(true);
//这里是主线程
//一些比较耗费时间的操作,比方联网获取数据,要求安放子线程去奉行
//TODO获取数据
finalRandom random =newRandom();
newHandler().postDelayed(newRunnable() {
@Override
public voidrun() {
list.add(0,"笔者是刷新天才" random.nextInt(100卡塔尔 "号"State of Qatar;
mAdapter.notifyDataSetChanged();
Toast.makeText(MainActivity.this,"刷新了一条数据", Toast.LENGTH_SHORT).show();
//加载完数据设置为不刷新状态,将下拉速度收起来
swipe.setRefreshing(false);
}
},2000);
}
});
}
/**
*@authorhy
@time2016/10/1 17:57 /
private voidinit() {
addData();
if(list!=null) {
if(mAdapter==null) {
mAdapter=newListviewAdapter(this,list);
lv.setAdapter(mAdapter);
}else{
mAdapter.notifyDataSetChanged();
}
}
}
/
*@authorhy
@time2016/10/1 17:57 /
public voidaddData() {
for(inti =1; i <=100; i ) {
list.add("作者是天才" i "号"State of Qatar;
}
}
xml结构文件:
正是二个swipeRefreshLayout里面包裹一个listview就能够.
加多footer,上啦加载越来越多,自定义该控件.
/

*作者:hy on 2016/10/2 00:02
邮箱: simoncqhy@163.com /
public classSwipeRefreshViewextendsSwipeRefreshLayout {
privateViewmFooterView;
//滑动的小小距离
private intmSlop;
//获取listview
privateListViewmListView;
privateOnLoadListenermOnLoadListener;
//正在加载状态
private booleanisLoading;
publicSwipeRefreshView(Context context) {
this(context,null);
}
publicSwipeRefreshView(Context context, AttributeSet attrs) {
super(context, attrs);
mFooterView= View.inflate(context, R.layout.view_footer,null);
//设置滑动的小不点儿间隔,大于该间距才干滑动。
mSlop= ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
protected voidonLayout(booleanchanged,intleft,inttop,intright,intbottom) {
super.onLayout(changed, left, top, right, bottom);
if(mListView==null) {
//决断容器有微微个子孩子
if(getChildCount()>0) {
//决断第二个儿女是否ListView
if(getChildAt(0)instanceofListView) {
//创建ListView对象
mListView= (ListView) getChildAt(0);
//设置ListView的滑动监听
setListViewOnScroll();
}
}
}
}
//设置listview的滑动监听
private voidsetListViewOnScroll() {
mListView.setOnScrollListener(newAbsListView.OnScrollListener() {
@Override
public voidonScrollStateChanged(AbsListView view,intscrollState) {
//移动进度中决断时候能下拉加载越来越多
if(canLoadMore()) {
//加载数据
loadData();
}
}
@Override
public voidonScroll(AbsListView view,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount) {
}
});
}
/
*分发事件的拍卖
*@paramev
@return /
private floatmDownY,mUpY;
@Override
public booleandispatchTouchEvent(MotionEvent ev) {
switch(ev.getAction()) {
caseMotionEvent.ACTION_DOWN:
//移动的源点
mDownY= ev.getY();
break;
caseMotionEvent.ACTION_MOVE:
//移动进度中判断时候能下拉加载更多
if(canLoadMore()) {
//加载数据
loadData();
}
break;
caseMotionEvent.ACTION_UP:
//移动的终极
mUpY= getY();
break;
}
return super.dispatchTouchEvent(ev);
}
/

*看清是不是能够加载更加的多
@return /
private booleancanLoadMore() {
// 1.是上拉景观
booleancondition1 = (mDownY-mUpY) >=mSlop;
if(condition1) {
System.out.println("是上拉气象"State of Qatar;
}
// 2.当下页面可知的item是最终贰个条文
booleancondition2 =false;
if(mListView!=null&&mListView.getAdapter() !=null) {
condition2 =mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() -1);
}
if(condition2) {
System.out.println("是最后二个规规矩矩"卡塔尔(قطر‎;
}
// 3.正值加载状态
booleancondition3 = !isLoading;
if(condition3) {
System.out.println("不是正值加载状态"卡塔尔;
}
returncondition1 && condition2 && condition3;
}
/
管理加载数据的逻辑 /
private voidloadData() {
System.out.println("加载数据..."State of Qatar;
if(mOnLoadListener!=null) {
//设置加载状态,让结构彰显出来
setLoading(true);
mOnLoadListener.onLoad();
}
}
/

*设置加载状态,是或不是加载传入boolean值进行决断

SwipeRefreshLayout

SwipeRefreshLayout是Google自家生产的下拉刷新的控件,效果大约是下拉到了迟早的莫斯中国科学技术大学学交易会开刷新,若高度相当不足会回笼上去。正在刷新进程中,继续下拉无反应。

官方文书档案中有四个要害提示,SwipeRefreshLayout的子视图必需是ListView,RecyleView,ScrollView,GridView等可滑动的控件。并且一定要有叁个控件。

● setColorSchemeResources(卡塔尔(قطر‎;//设置刷新控件动漫中的颜色。参数为财富id

本文由ca88发布,转载请注明来源

关键词: 自定义 日记本 随笔 详解 加载