分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。
(转载声明出处:http://www.cnblogs.com/linguanh/)
简介:
该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源、点击事件,等核心操作,本类采用接口形式提供上述具体操作!
1,所有关键的操作使用接口,由用户自己定义,
包括:数据适配器的配置、动态加载函数的配置、item点击接口;
2,已经新建线程来执行动态函数。
//3,提供一个默认的动态执行函数;
用法:
你只需要在自己的 activity、fragment或者其他,之后调用其构造函数new 一个该类对象,同时传入你的 ListView,然后再继承它的两个接口:
configAdapterForListView、configRefreshData;
通过 两行代码绑定接口:
setConfigListviewAdapterListener(this)
setConfigRefreshDataListener(this)
共重写 4 个函数,分别是:
@Override
public SimpleAdapter configSimpleAdapter() {
//在这里配置 SimpleAdapter,再返回,默认返回null
return null;
} @Override
public ArrayAdapter configArrayAdapter() {
//在这里配置 ArrayAdapter
return null;
} @Override
public void configOnItemClick(AdapterView<?> parent, View view, int position, long id) {
// 在这里处理 listView的 点击事件
} @Override
public void refreshData() {
//在这里处理 加载操作,无需再新建线程执行
}
最后通过调用 setListviewAdapter();完成所有操作,这个函数执行后,它会自动调用,上述两个数据适配器接口,和你传进去的ListView 进行 绑定。
其他数据适配器,可以自行添加,或者重写我的类进行修改,相信你绝对看得懂!
代码:
类
package com.lgh.addItemListview; import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* Created by LinGuanHong on 2015/7/14.
* 简介:
* 该ListView 实现动态加载数据
* 1,所有关键的操作使用接口,由用户自己定义,
* 包括:数据适配器的配置、动态加载函数的配置、item点击接口;
* 2,已经新建线程来执行动态函数。
* //3,提供一个默认的动态执行函数;
*/
public class mainListview implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener { private Boolean isSimpleDapter = false;//默认是 ArrayAdapter
private Boolean refreshAble = false;//防止一直刷新
private List<Map<String,Object>> defaultDataList;
private configAdapterForListView adapter;
private configRefreshData refresh;
private ListView listview;
private Handler dealHandler;
private int defaultDataSize;
private Context context; public mainListview(Context context,ListView listview){
this.context = context;
if(listview!=null){
this.listview = listview;
43 initAll();
}
} public void setConfigListviewAdapterListener(configAdapterForListView adapter){
this.adapter = adapter;
} private configAdapterForListView getListviewAdapterListener(){
return adapter;
} public void setConfigRefreshDataListener(configRefreshData refresh){
this.refresh = refresh;
} private configRefreshData getConfigRefreshDataListener(){
return refresh;
} void initAll(){
initHandler();
listview.setOnScrollListener(this);
listview.setOnItemClickListener(this);
} public void setListviewAdapter(){
if(listview!=null){
if((getListviewAdapterListener().configArrayAdapter())!=null){
listview.setAdapter(getListviewAdapterListener().configArrayAdapter());
}else if((getListviewAdapterListener().configSimpleAdapter())!=null){
isSimpleDapter=true;
listview.setAdapter(getListviewAdapterListener().configSimpleAdapter());
}
}else{ }
} void initHandler(){
dealHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==1){
if(isSimpleDapter){ //判断用户选择的是何种适配器
getListviewAdapterListener().configArrayAdapter().notifyDataSetChanged();
//refreshAble = true;
}else{
getListviewAdapterListener().configArrayAdapter().notifyDataSetChanged();
//refreshAble = true;
}
}
}
};
} //为了优化内存,由用户自己选择是否启用默认数据
public void setDefaultDataList(int defaultDataSize){
this.defaultDataSize = defaultDataSize;
defaultDataList = new ArrayList<Map<String, Object>>();
} public List<Map<String,Object>> defaultRefreshDataFunction(){
for(int i=0;i<defaultDataSize;i++){
Map<String,Object> map = new HashMap<String, Object>();
//默认的操作
}
return defaultDataList;
} @Override
public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//firstVisibleItem:当前能看见的第一个列表项ID(从0开始)
//visibleItemCount:当前能看见的列表项个数(小半个也算)
//totalItemCount:列表项共数
if(firstVisibleItem+visibleItemCount==totalItemCount && totalItemCount>0){
new Thread(new Runnable() {
@Override
public void run() {
getConfigRefreshDataListener().refreshData();//执行更新接口
Message msg = new Message();
msg.what = 1;
dealHandler.sendMessage(msg);
}
}).start();
}
} @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
getListviewAdapterListener().configOnItemClick(parent,view,position,id);//调用 item接口点击
} public interface configAdapterForListView{
//配置 SimpleAdapter数据适配器接口
public SimpleAdapter configSimpleAdapter();
// 配置 ArrayAdapter 数据适配器接口
public ArrayAdapter configArrayAdapter();
// item 点击事件接口
public void configOnItemClick(AdapterView<?> parent, View view, int position, long id);
} public interface configRefreshData{
//实现这个接口来设置用户下滑时,动态加载数据 接口
public void refreshData();
}
}
测试例子 activity
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter; import com.lgh.addItemListview.mainListview; import java.util.ArrayList;
import java.util.List; public class MainActivity extends Activity implements
mainListview.configAdapterForListView,mainListview.configRefreshData { ArrayAdapter<String> adapter;
List<String> res = new ArrayList<String>() ;
private ListView myListview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testlv);
for(int j = 0;j<20;j++){
res.add("beijing");
}
myListview = (ListView) findViewById(R.id.lv);
mainListview test = new mainListview(this,myListview);
test.setConfigListviewAdapterListener(this);
test.setConfigRefreshDataListener(this);
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,res);
test.setListviewAdapter();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
} @Override
public SimpleAdapter configSimpleAdapter() { return null;
} @Override
public ArrayAdapter configArrayAdapter() {
return adapter;
} @Override
public void configOnItemClick(AdapterView<?> parent, View view, int position, long id) {
// 在这里处理 listView的 点击事件
} @Override
public void refreshData() {
addString();
} void addString(){
res.add("i am the new");
}
public List<String> getData(){
return res;
}
}
分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。的更多相关文章
- Android中ListView动态加载数据
1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的 ...
- Android 自定义ListView动态加载数据
我们都知道网络取数据是耗时操作,如果我们一次性请求所有数据,假如数据量不多那还可以接受,但是如果数据量特别多,那么带来的后果就是用户的愤怒(用户是很没有耐心的),所以这时候我们就需要动态的加载数据,分 ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...
- Android中的动态加载机制
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
- Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法
Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...
- Android 实现布局动态加载
Android 动态加载布局 通过使用LayoutInflater 每次点击按钮时候去读取布局文件,然后找到布局文件里面的各个VIEW 操作完VIEW 后加载进我们setContentView 方面里 ...
- Android开发技巧——TextView加载HTML的图片及代码显示问题
前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的 ...
- [Android Pro] so 动态加载—解决sdk过大问题
原文地址: https://blog.csdn.net/Rong_L/article/details/75212472 前言 相信Android 开发中大家或多或少都会集成一些第三方sdk, 而其中难 ...
随机推荐
- css解决display:inline-block;产生的缝隙(间隙)
今天在做H5的水平滑动卡片时用到了display:inline-block;却发现处在同一水平线上的元素之间居然产生了缝隙,这很显然不是我想要的效果,所以我就换成了左浮动,这样缝隙的问题是解决了,但是 ...
- 运行错误:error while loading shared libraries: xxx.so.0:cannot open shared object file: No such file or
链接时可以通过-L和-l来指定自己的库,因此链接可以通过,但是运行时,系统仍无法找到指定的库,需要简单配置一下. 解决方法: 可以直接在将自己的库所在路径添加到/etc/ld.so.conf文件中.但 ...
- strcpy函数在VS2015无法使用的问题
一:原因:一般认为是vs准备弃用strcpy的,安全性较低,所以微软提供了strcpy_s来代替 然而,strcpy_s并没有strcpy好用,我们要想继续在VS2015中使用strcpy该怎么办 呢 ...
- vim插件之tabular,代码对齐强迫症必备
本周整理一批别人写的代码,要处理好所有的注释和缩进. 碰到那种大片的赋值或者注释或者宏定义,但又没对齐的,简直太难看了. 于是手工对了几个,觉得确实不是人干的活,心想这种需求应该有工具自动搞定才对啊, ...
- NLP常用工具
1.统计类工具:可参见[统计学习常用Python扩展包] 2.linux自带工具:可参见[[整理]Linux常用文本处理命令] 3.简繁转换工具:opencc Open Chinese Convert ...
- IIS Community Newsletter June 2013
Announcements Windows 2012 Server R2 preview released Windows Server 2012 R2 provides a wide range o ...
- 领域驱动设计(DDD)部分核心概念的个人理解
领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...
- 玩转JavaScript OOP[4]——实现继承的12种套路
概述 在之前的文章中,我们借助构造函数实现了"类",然后结合原型对象实现了"继承",并了解了JavaScript中原型链的概念. 理解这些内容,有助于我们更深入 ...
- [解惑]JavaScript事件机制
群里童鞋问到关于事件传播的一个问题:“事件捕获的时候,阻止冒泡,事件到达目标之后,还会冒泡吗?”. 初学 JS 的童鞋经常会有诸多疑问,我在很多 QQ 群也混了好几年了,耳濡目染也也收获了不少,以后会 ...
- 精简版StringBuilder,提速字符串拼接
编写目的 在频繁的字符串拼接中,为了提升程序的性能,我们往往会用StringBuilder代替String+=String这样的操作; 而我在实际编码中发现,大部分情况下我用到的只是StringBui ...