(转载声明出处: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. @Override
  19. public void refreshData() {
  20. //在这里处理 加载操作,无需再新建线程执行
  21. }

最后通过调用 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. }
    }
  44.  
  45. public void setConfigListviewAdapterListener(configAdapterForListView adapter){
  46. this.adapter = adapter;
  47. }
  48.  
  49. private configAdapterForListView getListviewAdapterListener(){
  50. return adapter;
  51. }
  52.  
  53. public void setConfigRefreshDataListener(configRefreshData refresh){
  54. this.refresh = refresh;
  55. }
  56.  
  57. private configRefreshData getConfigRefreshDataListener(){
  58. return refresh;
  59. }
  60.  
  61. void initAll(){
  62. initHandler();
  63. listview.setOnScrollListener(this);
  64. listview.setOnItemClickListener(this);
  65. }
  66.  
  67. public void setListviewAdapter(){
  68. if(listview!=null){
  69. if((getListviewAdapterListener().configArrayAdapter())!=null){
  70. listview.setAdapter(getListviewAdapterListener().configArrayAdapter());
  71. }else if((getListviewAdapterListener().configSimpleAdapter())!=null){
  72. isSimpleDapter=true;
  73. listview.setAdapter(getListviewAdapterListener().configSimpleAdapter());
  74. }
  75. }else{
  76.  
  77. }
  78. }
  79.  
  80. void initHandler(){
  81. dealHandler = new Handler(){
  82. @Override
  83. public void handleMessage(Message msg) {
  84. super.handleMessage(msg);
  85. if(msg.what==1){
  86. if(isSimpleDapter){ //判断用户选择的是何种适配器
  87. getListviewAdapterListener().configArrayAdapter().notifyDataSetChanged();
  88. //refreshAble = true;
  89. }else{
  90. getListviewAdapterListener().configArrayAdapter().notifyDataSetChanged();
  91. //refreshAble = true;
  92. }
  93. }
  94. }
  95. };
  96. }
  97.  
  98. //为了优化内存,由用户自己选择是否启用默认数据
  99. public void setDefaultDataList(int defaultDataSize){
  100. this.defaultDataSize = defaultDataSize;
  101. defaultDataList = new ArrayList<Map<String, Object>>();
  102. }
  103.  
  104. public List<Map<String,Object>> defaultRefreshDataFunction(){
  105. for(int i=0;i<defaultDataSize;i++){
  106. Map<String,Object> map = new HashMap<String, Object>();
  107. //默认的操作
  108. }
  109. return defaultDataList;
  110. }
  111.  
  112. @Override
  113. public void onScrollStateChanged(AbsListView view, int scrollState) {
  114.  
  115. }
  116.  
  117. @Override
  118. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  119. //firstVisibleItem:当前能看见的第一个列表项ID(从0开始)
  120. //visibleItemCount:当前能看见的列表项个数(小半个也算)
  121. //totalItemCount:列表项共数
  122. if(firstVisibleItem+visibleItemCount==totalItemCount && totalItemCount>0){
  123. new Thread(new Runnable() {
  124. @Override
  125. public void run() {
  126. getConfigRefreshDataListener().refreshData();//执行更新接口
  127. Message msg = new Message();
  128. msg.what = 1;
  129. dealHandler.sendMessage(msg);
  130. }
  131. }).start();
  132. }
  133. }
  134.  
  135. @Override
  136. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  137. getListviewAdapterListener().configOnItemClick(parent,view,position,id);//调用 item接口点击
  138. }
  139.  
  140. public interface configAdapterForListView{
  141. //配置 SimpleAdapter数据适配器接口
  142. public SimpleAdapter configSimpleAdapter();
  143. // 配置 ArrayAdapter 数据适配器接口
  144. public ArrayAdapter configArrayAdapter();
  145. // item 点击事件接口
  146. public void configOnItemClick(AdapterView<?> parent, View view, int position, long id);
  147. }
  148.  
  149. public interface configRefreshData{
  150. //实现这个接口来设置用户下滑时,动态加载数据 接口
  151. public void refreshData();
  152. }
  153. }

测试例子 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;
    List<String> res = new ArrayList<String>() ;
  20. private ListView myListview;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.testlv);
  25. for(int j = 0;j<20;j++){
  26. res.add("beijing");
  27. }
  28. myListview = (ListView) findViewById(R.id.lv);
  29. mainListview test = new mainListview(this,myListview);
  30. test.setConfigListviewAdapterListener(this);
  31. test.setConfigRefreshDataListener(this);
  32. adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,res);
  33. test.setListviewAdapter();
  34. }
  35.  
  36. @Override
  37. public boolean onCreateOptionsMenu(Menu menu) {
  38. getMenuInflater().inflate(R.menu.main, menu);
  39. return true;
  40. }
  41.  
  42. @Override
  43. public boolean onOptionsItemSelected(MenuItem item) {
  44. int id = item.getItemId();
  45. if (id == R.id.action_settings) {
  46. return true;
  47. }
  48. return super.onOptionsItemSelected(item);
  49. }
  50.  
  51. @Override
  52. public SimpleAdapter configSimpleAdapter() {
  53.  
  54. return null;
  55. }
  56.  
  57. @Override
  58. public ArrayAdapter configArrayAdapter() {
  59. return adapter;
  60. }
  61.  
  62. @Override
  63. public void configOnItemClick(AdapterView<?> parent, View view, int position, long id) {
  64. // 在这里处理 listView的 点击事件
  65. }
  66.  
  67. @Override
  68. public void refreshData() {
  69. addString();
  70. }
  71.  
  72. void addString(){
  73. res.add("i am the new");
  74. }
  75. public List<String> getData(){
  76. return res;
  77. }
  78. }

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

  1. Android中ListView动态加载数据

    1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的 ...

  2. Android 自定义ListView动态加载数据

    我们都知道网络取数据是耗时操作,如果我们一次性请求所有数据,假如数据量不多那还可以接受,但是如果数据量特别多,那么带来的后果就是用户的愤怒(用户是很没有耐心的),所以这时候我们就需要动态的加载数据,分 ...

  3. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

  4. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  5. Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...

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

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...

  7. Android 实现布局动态加载

    Android 动态加载布局 通过使用LayoutInflater 每次点击按钮时候去读取布局文件,然后找到布局文件里面的各个VIEW 操作完VIEW 后加载进我们setContentView 方面里 ...

  8. Android开发技巧——TextView加载HTML的图片及代码显示问题

    前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的 ...

  9. [Android Pro] so 动态加载—解决sdk过大问题

    原文地址: https://blog.csdn.net/Rong_L/article/details/75212472 前言 相信Android 开发中大家或多或少都会集成一些第三方sdk, 而其中难 ...

随机推荐

  1. matlab环境配置

    一.环境变量设置 AMD处理器:右键单击我的电脑 属性 — >高级 —> 环境变量 —> 系统变量 —> 新建 变量名:BLAS_VERSION,值为安装目录\atlas_At ...

  2. C++构造函数/析构函数 设置成private的原因

    C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...

  3. 多个table切换 getElementsByClassName

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. SQL Server CONVERT() 截取日期

    SELECT CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSELECT CONVERT(varchar(100), GETDATE() ...

  5. html 5 canvas画布整理

    1. 创建canvas画布<canvas id="myCanvas" width="800" height="800" >< ...

  6. Algorithm | Binary Search

    花了半天把二分查找的几种都写了一遍.验证了一下.二分查找的正确编写的关键就是,确保循环的初始.循环不变式能够保证一致. 可以先从循环里面确定循环不变式,然后再推导初始条件,最后根据循环不变式的内容推导 ...

  7. matlab 采样函数

    dyaddown 功能:对时间序列进行二元采样,每隔一个元素提取一个元素,得到一个降采样时间序列. 格式: 1.y = dyaddown(x, EVENODD) 当EVENODD=0时,从x中第二个元 ...

  8. ABP理论学习之内嵌资源文件

    返回总目录 本篇目录 介绍 创建内嵌文件 暴露内嵌文件 使用内嵌文件 介绍 在一个web应用中,有供客户端使用的javascript,css,xml等文件.它们一般是作为分离的文件被添加到web项目中 ...

  9. 配置NHibernate将枚举保存为Oracle数据库中的字符串

    假设有这样一个枚举: /// <summary> /// 字典项类型 /// </summary> public enum DicItemType { [EnumDescrip ...

  10. MongoDB 维护Replica Set

    在每个MongoDB(版本 3.2.9) Instance中,都有一个本地数据库(local),用于存储 Replication 进程的信息和本地数据.local 数据库的特性是:位于local数据库 ...