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主要方法:
setRefreshing(boolean): 显示或隐藏刷新进度条
isRefreshing(): 检查是否处于刷新状态
setColorScheme(): 设置进度条的颜色主题,最多能设置四种
* 先无论adapter是Adapter的类型【聚集类型】
* 实现adapter的ListView至少:数据【实体:JavaBean】、聚集【用来存放实体的聚集】、布局ListView 或者 ListView相关子类【用来存放类容的】
* adapter【你用来适配聚集的的一个adapter】、让布局和适配器联系起来【setAdapter】
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创建消息时使用。消息池提高了消息对象的复用,降低系统垃圾回收的次数。消息的创建流程如图所看到的。
UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一相应。
使用ThreadLocal的目的是保证每个线程仅仅创建唯一一个Looper。之后其它Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此。主线程、消息循环、消息队列之间的关系是1:1:1。
Handler、Looper、MessageQueue的初始化流程如图所看到的:
3.Handler处理消息
UI主线程通过Looper循环查询消息队列UI_MQ。当发现有消息存在时会将消息从消息队列中取出。
首先分析消息,通过消息的參数推断该消息相应的Handler,然后将消息分发到指定的Handler进行处理。
子线程通过Handler、Looper与UI主线程通信的流程如图所看到的。