自己敲了下代码,这个方式刷新确实给人耳目一新的感觉。资源:含有两个SwipeRefreshLayout实战的Demo,

用起来很好用:看看文档几个重要的方法,简单拿来用没有不论什么问题。


Android SwipeRefreshLayout 官方下拉刷新控件介绍—Handler原理—Adapter总结_javaAndroid SwipeRefreshLayout 官方下拉刷新控件介绍—Handler原理—Adapter总结_android_02


案例1:

主要相关代码

public class MainActivity extends Activity implements SwipeRefreshLayout.OnRefreshListener
{

private static final int REFRESH_COMPLETE = 0X110;
private SwipeRefreshLayout mSwipeLayout;
private ListView mListView;
private ArrayAdapter<String> mAdapter;
private List<String> mDatas = new ArrayList<String>(Arrays.asList("Java", "Javascript", "C++", "Ruby", "Json",
"HTML"));

private Handler mHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
switch (msg.what)
{
case REFRESH_COMPLETE:
mDatas.addAll(Arrays.asList("Lucene", "Canvas", "Bitmap"));
mAdapter.notifyDataSetChanged();
mSwipeLayout.setRefreshing(false);
break;

}
};
};

protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mListView = (ListView) findViewById(R.id.id_listview);
mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.id_swipe_ly);

mSwipeLayout.setOnRefreshListener(this);
mSwipeLayout.setColorScheme(android.R.color.holo_green_dark, android.R.color.holo_green_light,
android.R.color.holo_orange_light, android.R.color.holo_red_light);

mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mDatas);
mListView.setAdapter(mAdapter);

}

public void onRefresh()
{
mHandler.sendEmptyMessageDelayed(REFRESH_COMPLETE, 2000);

}
}


当中的布局例如以下:基本上全部的布局都是被一个刷新的布局

android.support.v4.widget.SwipeRefreshLayout<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">所包围</span></span>
<span style="font-size:18px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/id_swipe_ly"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/id_listview"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>



案例二:

採用了adapter适配器来适配相关数据,实现更好的展示效果:】

adapter

public class ListViewAdapter extends BaseAdapter {
/** 环境信息 **/
private Context context;
/** 用户中心信息集合 **/
private ArrayList<SoftwareClassificationInfo> list;
/** 构造**/
public ListViewAdapter(Context context, ArrayList<SoftwareClassificationInfo> list) {
this.context = context;
this.list = list;
}
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int arg0) {
return 0;
}
public View getView(int position, View convertView, ViewGroup arg2) {
_View view = null;
if (convertView == null) {
view = new _View();
convertView = LayoutInflater.from(context).inflate(R.layout.user_center_list_item, null);
view.list_text = (TextView) convertView.findViewById(R.id.user_center_item_txt);
view.list_img = (ImageView) convertView.findViewById(R.id.user_center_item_img);
convertView.setTag(view);
} else {
view = (_View) convertView.getTag();
}
view.list_text.setText(list.get(position).getCatname());
// view.list_img.setBackgroundDrawable(context.getResources().getDrawable(
// R.drawable.tool_box_fragment_settings_icon));
view.list_img.setBackgroundResource(R.drawable.tool_box_fragment_settings_icon);
return convertView;
}
class _View {
TextView list_text;
ImageView list_img;
}
}

实体类:

public class SoftwareClassificationInfo {
/** 分类编号 **/
private int cid;
/** 分类名字 **/
private String catname;

public int getCid() {
return cid;
}

public void setCid(int cid) {
this.cid = cid;
}

public String getCatname() {
return catname;
}

public void setCatname(String catname) {
this.catname = catname;
}

public SoftwareClassificationInfo() {
// TODO Auto-generated constructor stub
}

public SoftwareClassificationInfo(int cid, String catname) {
// TODO Auto-generated constructor stub
this.cid = cid;
this.catname = catname;
}
}


主Activity

public class SwipRefreshLayoutActivity extends Activity implements
SwipeRefreshLayout.OnRefreshListener {
private SwipeRefreshLayout swipeLayout;
private ListView listView;
private ListViewAdapter adapter;
private ArrayList<SoftwareClassificationInfo> list;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.swipe_refresh_layout);
//1.从布局中载入一个带刷新的ListView的外层SwipeRefreshLayout
swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
//2.给这个带刷新的ListView设置刷新监听器
swipeLayout.setOnRefreshListener(this);
//3.载入颜色是循环播放的,仅仅要没有完毕刷新就会一直循环,color1>color2>color3>color4
swipeLayout.setColorScheme(android.R.color.white,
android.R.color.holo_green_light,
android.R.color.holo_orange_light, android.R.color.holo_red_light);

list = new ArrayList<SoftwareClassificationInfo>();
list.add(new SoftwareClassificationInfo(1, "asdas"));

//得到这个刷新ListView中的ListView
listView = (ListView) findViewById(R.id.list);
adapter = new ListViewAdapter(this, list);
listView.setAdapter(adapter);
/*
* 个人总结:listView-----adapter
* 先无论adapter是Adapter的类型【聚集类型】
* 实现adapter的ListView至少:数据【实体:JavaBean】、聚集【用来存放实体的聚集】、布局ListView或者 ListView相关子类【用来存放类容的】
* adapter【你用来适配聚集的的一个adapter】、让布局和适配器联系起来【setAdapter】
*/
}

public void onRefresh() {
new Handler().postDelayed(new Runnable() {
public void run() {
swipeLayout.setRefreshing(false);
list.add(new SoftwareClassificationInfo(2, "ass"));
adapter.notifyDataSetChanged();
}
}, 3000);
}
}


总结:

一.SwipRefreshLayout主要方法:


setOnRefreshListener(OnRefreshListener): 为布局加入一个Listener

setRefreshing(boolean): 显示或隐藏刷新进度条

isRefreshing(): 检查是否处于刷新状态

setColorScheme(): 设置进度条的颜色主题,最多能设置四种 




二. 个人总结:listView-----adapter

* 先无论adapter是Adapter的类型【聚集类型】

* 实现adapter的ListView至少:数据【实体:JavaBean】、聚集【用来存放实体的聚集】、布局ListView                      或者 ListView相关子类【用来存放类容的】

*   adapter【你用来适配聚集的的一个adapter】、让布局和适配器联系起来【setAdapter】




三.案例一用到了Handler,这里再次总结一下:能够看一下源代码。很清晰。



 andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。


1)Looper: 一个线程能够产生一个Looper对象。由它来管理此线程里的MessageQueue(消息队列)。

 

2)Handler: 你能够构造Handler对象来与Looper沟通。以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。

3) Message Queue(消息队列):用来存放线程放入的消息。 

4)线程:UIthread 通常就是main thread。而Android启动程序时会替它建立一个MessageQueue。 

1.Handler创建消息

        每个消息都须要被指定的Handler处理,通过Handler创建消息便能够完毕此功能。Android消息机制中引入了消息池。

Handler创建消息时首先查询消息池中是否有消息存在,假设有直接从消息池中取得,假设没有则又一次初始化一个消息实例。

使用消息池的优点是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,降低系统垃圾回收的次数。消息的创建流程如图所看到的。 



Android SwipeRefreshLayout 官方下拉刷新控件介绍—Handler原理—Adapter总结_java_03


 2.Handler发送消息

UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一相应。

使用ThreadLocal的目的是保证每个线程仅仅创建唯一一个Looper。之后其它Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此。主线程、消息循环、消息队列之间的关系是1:1:1。

Handler、Looper、MessageQueue的初始化流程如图所看到的: 


Android SwipeRefreshLayout 官方下拉刷新控件介绍—Handler原理—Adapter总结_消息队列_04





 Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程能够通过Handler将消息发送到UI线程的消息队列MessageQueue中。

3.Handler处理消息

UI主线程通过Looper循环查询消息队列UI_MQ。当发现有消息存在时会将消息从消息队列中取出。

首先分析消息,通过消息的參数推断该消息相应的Handler,然后将消息分发到指定的Handler进行处理。

子线程通过Handler、Looper与UI主线程通信的流程如图所看到的。


Android SwipeRefreshLayout 官方下拉刷新控件介绍—Handler原理—Adapter总结_java_05