(轉載聲明出處:http://www.cnblogs.com/linguanh/)
簡介:
該ListView 實現動態加載數據,為了方便用戶充分地自定義自己的數據源、點擊事件,等核心操作,本類采用接口形式提供上述具體操作!
1,所有關鍵的操作使用接口,由用戶自己定義,
包括:數據適配器的配置、動態加載函數的配置、item點擊接口;
2,已經新建線程來執行動態函數。
//3,提供一個默認的動態執行函數;
用法:
你只需要在自己的 activity、fragment或者其他,之后調用其構造函數new 一個該類對象,同時傳入你的 ListView,然后再繼承它的兩個接口:
configAdapterForListView、configRefreshData;
通過 兩行代碼綁定接口:
setConfigListviewAdapterListener(this)
setConfigRefreshDataListener(this)
共重寫 4 個函數,分別是:
1 @Override 2 public SimpleAdapter configSimpleAdapter() { 3 //在這里配置 SimpleAdapter,再返回,默認返回null 4 return null; 5 } 6 7 @Override 8 public ArrayAdapter configArrayAdapter() { 9 //在這里配置 ArrayAdapter 10 return null; 11 } 12 13 @Override 14 public void configOnItemClick(AdapterView<?> parent, View view, int position, long id) { 15 // 在這里處理 listView的 點擊事件 16 } 17 18 19 @Override 20 public void refreshData() { 21 //在這里處理 加載操作,無需再新建線程執行 22 }
最后通過調用 setListviewAdapter();完成所有操作,這個函數執行后,它會自動調用,上述兩個數據適配器接口,和你傳進去的ListView 進行 綁定。
其他數據適配器,可以自行添加,或者重寫我的類進行修改,相信你絕對看得懂!
代碼:
類
1 package com.lgh.addItemListview; 2 3 import android.content.Context; 4 import android.os.Handler; 5 import android.os.Message; 6 import android.view.View; 7 import android.widget.AbsListView; 8 import android.widget.AdapterView; 9 import android.widget.ArrayAdapter; 10 import android.widget.ListView; 11 import android.widget.SimpleAdapter; 12 13 import java.util.ArrayList; 14 import java.util.HashMap; 15 import java.util.List; 16 import java.util.Map; 17 18 /** 19 * Created by LinGuanHong on 2015/7/14. 20 * 簡介: 21 * 該ListView 實現動態加載數據 22 * 1,所有關鍵的操作使用接口,由用戶自己定義, 23 * 包括:數據適配器的配置、動態加載函數的配置、item點擊接口; 24 * 2,已經新建線程來執行動態函數。 25 * //3,提供一個默認的動態執行函數; 26 */ 27 public class mainListview implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener { 28 29 private Boolean isSimpleDapter = false;//默認是 ArrayAdapter 30 private Boolean refreshAble = false;//防止一直刷新 31 private List<Map<String,Object>> defaultDataList; 32 private configAdapterForListView adapter; 33 private configRefreshData refresh; 34 private ListView listview; 35 private Handler dealHandler; 36 private int defaultDataSize; 37 private Context context; 38 39 public mainListview(Context context,ListView listview){ 40 this.context = context; 41 if(listview!=null){ 42 this.listview = listview;
43 initAll(); 43 }
} 46 47 public void setConfigListviewAdapterListener(configAdapterForListView adapter){ 48 this.adapter = adapter; 49 } 50 51 private configAdapterForListView getListviewAdapterListener(){ 52 return adapter; 53 } 54 55 public void setConfigRefreshDataListener(configRefreshData refresh){ 56 this.refresh = refresh; 57 } 58 59 private configRefreshData getConfigRefreshDataListener(){ 60 return refresh; 61 } 62 63 void initAll(){ 64 initHandler(); 65 listview.setOnScrollListener(this); 66 listview.setOnItemClickListener(this); 67 } 68 69 public void setListviewAdapter(){ 70 if(listview!=null){ 71 if((getListviewAdapterListener().configArrayAdapter())!=null){ 72 listview.setAdapter(getListviewAdapterListener().configArrayAdapter()); 73 }else if((getListviewAdapterListener().configSimpleAdapter())!=null){ 74 isSimpleDapter=true; 75 listview.setAdapter(getListviewAdapterListener().configSimpleAdapter()); 76 } 77 }else{ 78 79 } 80 } 81 82 void initHandler(){ 83 dealHandler = new Handler(){ 84 @Override 85 public void handleMessage(Message msg) { 86 super.handleMessage(msg); 87 if(msg.what==1){ 88 if(isSimpleDapter){ //判斷用戶選擇的是何種適配器 89 getListviewAdapterListener().configArrayAdapter().notifyDataSetChanged(); 90 //refreshAble = true; 91 }else{ 92 getListviewAdapterListener().configArrayAdapter().notifyDataSetChanged(); 93 //refreshAble = true; 94 } 95 } 96 } 97 }; 98 } 99 100 //為了優化內存,由用戶自己選擇是否啟用默認數據 101 public void setDefaultDataList(int defaultDataSize){ 102 this.defaultDataSize = defaultDataSize; 103 defaultDataList = new ArrayList<Map<String, Object>>(); 104 } 105 106 public List<Map<String,Object>> defaultRefreshDataFunction(){ 107 for(int i=0;i<defaultDataSize;i++){ 108 Map<String,Object> map = new HashMap<String, Object>(); 109 //默認的操作 110 } 111 return defaultDataList; 112 } 113 114 @Override 115 public void onScrollStateChanged(AbsListView view, int scrollState) { 116 117 } 118 119 120 @Override 121 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 122 //firstVisibleItem:當前能看見的第一個列表項ID(從0開始) 123 //visibleItemCount:當前能看見的列表項個數(小半個也算) 124 //totalItemCount:列表項共數 125 if(firstVisibleItem+visibleItemCount==totalItemCount && totalItemCount>0){ 126 new Thread(new Runnable() { 127 @Override 128 public void run() { 129 getConfigRefreshDataListener().refreshData();//執行更新接口 130 Message msg = new Message(); 131 msg.what = 1; 132 dealHandler.sendMessage(msg); 133 } 134 }).start(); 135 } 136 } 137 138 @Override 139 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 140 getListviewAdapterListener().configOnItemClick(parent,view,position,id);//調用 item接口點擊 141 } 142 143 public interface configAdapterForListView{ 144 //配置 SimpleAdapter數據適配器接口 145 public SimpleAdapter configSimpleAdapter(); 146 // 配置 ArrayAdapter 數據適配器接口 147 public ArrayAdapter configArrayAdapter(); 148 // item 點擊事件接口 149 public void configOnItemClick(AdapterView<?> parent, View view, int position, long id); 150 } 151 152 public interface configRefreshData{ 153 //實現這個接口來設置用戶下滑時,動態加載數據 接口 154 public void refreshData(); 155 } 156 }
測試例子 activity
1 import android.app.Activity; 2 import android.os.Bundle; 3 import android.view.Menu; 4 import android.view.MenuItem; 5 import android.view.View; 6 import android.widget.AdapterView; 7 import android.widget.ArrayAdapter; 8 import android.widget.ListView; 9 import android.widget.SimpleAdapter; 10 11 import com.lgh.addItemListview.mainListview; 12 13 import java.util.ArrayList; 14 import java.util.List; 15 16 public class MainActivity extends Activity implements 17 mainListview.configAdapterForListView,mainListview.configRefreshData { 18 19 ArrayAdapter<String> adapter;
21 List<String> res = new ArrayList<String>() ; 22 private ListView myListview; 23 @Override 24 protected void onCreate(Bundle savedInstanceState) { 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.testlv); 27 for(int j = 0;j<20;j++){ 28 res.add("beijing"); 29 } 30 myListview = (ListView) findViewById(R.id.lv); 31 mainListview test = new mainListview(this,myListview); 32 test.setConfigListviewAdapterListener(this); 33 test.setConfigRefreshDataListener(this); 34 adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,res); 35 test.setListviewAdapter(); 36 } 37 38 39 @Override 40 public boolean onCreateOptionsMenu(Menu menu) { 42 getMenuInflater().inflate(R.menu.main, menu); 43 return true; 44 } 45 46 @Override 47 public boolean onOptionsItemSelected(MenuItem item) { 51 int id = item.getItemId(); 52 if (id == R.id.action_settings) { 53 return true; 54 } 55 return super.onOptionsItemSelected(item); 56 } 57 58 @Override 59 public SimpleAdapter configSimpleAdapter() { 60 61 return null; 62 } 63 64 @Override 65 public ArrayAdapter configArrayAdapter() { 66 return adapter; 67 } 68 69 @Override 70 public void configOnItemClick(AdapterView<?> parent, View view, int position, long id) { 71 // 在這里處理 listView的 點擊事件 72 } 73 74 75 @Override 76 public void refreshData() { 77 addString(); 78 } 79 80 void addString(){ 81 res.add("i am the new"); 82 } 83 public List<String> getData(){ 84 return res; 85 } 86 }