滾動到底部加載更多及下拉刷新listview的使用
本文主要介紹可同時實現(xiàn)下拉刷新及滑動到底部加載更多的ListView的使用。
該ListView優(yōu)點包括:a. 可自定義下拉響應(yīng)事件(如下拉刷新) b.可自定義滾動到底部響應(yīng)的事件(如滑動到底部加載更多) c.可自定義豐富的樣式 d.高效(若下拉樣式關(guān)閉不會加載其布局,同listView效率一致) e. 豐富的設(shè)置。
本文可運行APK地址可見TrineaAndroidDemo.apk,可運行代碼地址可見DropDownListViewDemo@Google Code,效果圖如下:
1、引入公共庫
引入TrineaAndroidCommon@GoogleCode作為你項目的library,或是自己抽取其中的DropDownListView部分使用
2、在layout中定義
將布局中的ListView標(biāo)簽換成cn.trinea.android.common.view.DropDownListView標(biāo)簽
并加上自定義屬性的命名空間xmlns:listViewAttr="http://schemas.android.com/apk/res/cn.trinea.android.demo",其中cn.trinea.android.demo需要用自己的包名替換。如何自定義屬性及其命名空間可見本文***。xml代碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:listViewAttr="http://schemas.android.com/apk/res/cn.trinea.android.demo"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <cn.trinea.android.common.view.DropDownListView
- android:id="@+id/list_view"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:drawSelectorOnTop="false"
- android:paddingBottom="@dimen/dp_40"
- listViewAttr:isDropDownStyle="true"
- listViewAttr:isOnBottomStyle="true"
- listViewAttr:isAutoLoadOnBottom="true" />
- </RelativeLayout>
DropDownListView自定義了三個boolean屬性
- <declare-styleable name="drop_down_list_attr">
- <attr name="isDropDownStyle" format="boolean" />
- <attr name="isOnBottomStyle" format="boolean" />
- <attr name="isAutoLoadOnBottom" format="boolean" />
- </declare-styleable>
isDropDownStyle表示是否允許下拉樣式,java代碼中可自定義下拉listener,表示需要完成的任務(wù)
isOnBottomStyle表示是否允許底部樣式,java代碼中可自定義滾動到底部的listener,表示需要完成的任務(wù)
isAutoLoadOnBottom表示是否允許滾動到底部時自動執(zhí)行對應(yīng)listener,僅在isOnBottomStyle為true時有效
PS:如果isDropDownStyle或isOnBottomStyle為false,并不會加載對應(yīng)的布局,所以性能同ListView一樣
3、在Java類中調(diào)用
通過setOnDropDownListener設(shè)置下拉的事件,不過需要在事件結(jié)束時手動調(diào)用onDropDownComplete恢復(fù)狀態(tài)
通過setOnBottomListener設(shè)置滾動到底部的事件,不過需要在事件結(jié)束時手動調(diào)用onBottomComplete恢復(fù)狀態(tài),示例代碼如下:
- /**
- * DropDownListViewDemo
- *
- * @author Trinea 2013-6-1
- */
- public class DropDownListViewDemo extends BaseActivity {
- private LinkedList<String> listItems = null;
- private DropDownListView listView = null;
- private ArrayAdapter<String> adapter;
- private String[] mStrings = { "Aaaaaa", "Bbbbbb", "Cccccc", "Dddddd", "Eeeeee",
- "Ffffff", "Gggggg", "Hhhhhh", "Iiiiii", "Jjjjjj", "Kkkkkk", "Llllll", "Mmmmmm",
- "Nnnnnn", };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState, R.layout.drop_down_listview_demo);
- listView = (DropDownListView)findViewById(R.id.list_view);
- // set drop down listener
- listView.setOnDropDownListener(new OnDropDownListener() {
- @Override
- public void onDropDown() {
- new GetDataTask(true).execute();
- }
- });
- // set on bottom listener
- listView.setOnBottomListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- new GetDataTask(false).execute();
- }
- });
- listItems = new LinkedList<String>();
- listItems.addAll(Arrays.asList(mStrings));
- adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems);
- listView.setAdapter(adapter);
- }
- private class GetDataTask extends AsyncTask<Void, Void, String[]> {
- private boolean isDropDown;
- public GetDataTask(boolean isDropDown){
- this.isDropDown = isDropDown;
- }
- @Override
- protected String[] doInBackground(Void... params) {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- ;
- }
- return mStrings;
- }
- @Override
- protected void onPostExecute(String[] result) {
- if (isDropDown) {
- listItems.addFirst("Added after drop down");
- adapter.notifyDataSetChanged();
- // should call onDropDownComplete function of DropDownListView at end of drop down complete.
- SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd HH:mm:ss");
- listView.onDropDownComplete(getString(R.string.update_at)
- + dateFormat.format(new Date()));
- } else {
- listItems.add("Added after on bottom");
- adapter.notifyDataSetChanged();
- // should call onBottomComplete function of DropDownListView at end of on bottom complete.
- listView.onBottomComplete();
- }
- super.onPostExecute(result);
- }
- }
- }
4、高級接口設(shè)置
5、樣式設(shè)置(自定義header和footer信息)