分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。

(转载声明出处: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 }
时间: 2024-10-02 10:06:58

分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。的相关文章

Android中ListView动态加载数据

1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样可以极大的改善应用程序的性能和用户体验. 2. 交互: 进入ListView组件,首先预加载N条记录,当用户滑动到最后一条记录显示加载提示信息,并从后台加载N条数据,接着渲染UI界面. 3. 效果图: 4. 程序实现: package com.focus.l

Android中的动态加载机制

在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病. Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式.如何开发一个可以自定义

Android中的动态加载机制--薛彦顺

在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病. Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式. 如何开发一个可以自定

Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

Android中ListView异步加载图片错位.重复.闪烁问题分析及解决方案 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而ImageView控件就是View对象通

Android之ListView异步加载网络图片(优化缓存机制)【转】

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4.对下载的图片进行按比例缩放,以减少内存的消耗 具体的代码里面说明.先放上内存缓存类的代码MemoryCache.java: public class MemoryCache { private static final String TAG = "MemoryCa

Android之ListView异步加载图片且仅显示可见子项中的图片

折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整实例都没看到,只有自己一点点研究了,总体感觉 android 下面要显示个图片真不容易啊. 项目主要实现的功能: 异步加载图片图片内存缓存.异步磁盘文件缓存解决使用 viewHolder 后出现的图片错位问题优化列表滚动性能,仅显示可见子项中的图片无需固定图片显示高度,对高度进行缓存使列表滚动时不会

Android中apk动态加载技术研究(1)基础知识研修

java classloader 和android中DexClassloader对比: Java ClassLoader : 作用: 主要用来加载class 到jvm中,以供程序使用,也就是说:java程序可以动态加载类定义,而这个动态加载机制就是通过ClassLoader来实现的 核心loader: A:: bootstrap classloader(启动类加载器) -->加载java核心api,包括用户自定义的classloader和另外两个loader B: ExtClassLoader

Android 实现布局动态加载

Android 动态加载布局 通过使用LayoutInflater 每次点击按钮时候去读取布局文件,然后找到布局文件里面的各个VIEW 操作完VIEW 后加载进我们setContentView 方面里面的要放的布局文件里面,每次动态加载文件必需 调用 removeAllViews方法,清除之前的加载进来的 View .是不是很简单?当然动态加载VIEW 还有许多种方法,多尝试不同写法.可能会领会不一样的心得,祝你早上掌握android 的开发技术. 主要原理:在一个分割出来的大的Layout中(

android 中的动态加载

这里所说的动态加载是加载一个包(插件),其实就是一个 apk只是这个apk 动态加载而已.创建一个要动态加载的 apk(插件)写一个类用于动态加载//DynamicTest.java package com.example.liuhailong.idynamic; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.Dia