(转载声明出处:https://cloud.tencent.com/developer/user/1148436/activities)
简介: 该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 }