首页 > 代码库 > Android SwipeRefreshLayout 官方下拉刷新控件介绍—Handler原理—Adapter总结

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

參考博客:http://blog.csdn.net/lmj623565791/article/details/24521483

自己敲了下代码,这个方式刷新确实给人耳目一新的感觉。资源:含有两个SwipeRefreshLayout实战的Demo,http://download.csdn.net/detail/itjavawfc/8847339

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


技术分享技术分享


案例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创建消息时使用。消息池提高了消息对象的复用,降低系统垃圾回收的次数。消息的创建流程如图所看到的。 


技术分享
 2.Handler发送消息
UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一相应。

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


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

技术分享

 Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程能够通过Handler将消息发送到UI线程的消息队列MessageQueue中。
3.Handler处理消息
UI主线程通过Looper循环查询消息队列UI_MQ。当发现有消息存在时会将消息从消息队列中取出。

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


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


技术分享









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