BaseAdapter自定义适配器
listview = (ListView) findViewById(R.id.listview);
imageview = (ImageView) findViewById(R.id.imageview);
//填充数据
for(int i = 0; i < 30; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "第" +i+"个人");
map.put("age", i);
list.add(map);
}
// 当listview中没有数据的时候显示空白的图片
listview.setEmptyView(imageview);
// 创建MyAdapter对象(这是不是用系统定义的ArrayAdapter)
MyAdapter adapter = new MyAdapter();
// 显示adapter对象到listview上
listview.setAdapter(adapter);
// 定制自己的Adapter 继承BaseAdapter
class MyAdapter extends BaseAdapter {
// 该Adapter对应的数据列表中有多少项目
@Override
public int getCount() {
return list.size();
}
// 根据下标获取数据列表中对应的项目
@Override
public Object getItem(int position) {
return list.get(position);
}
// 根据下标获得数据列表中对应的下标
@Override
public long getItemId(int position) {
return position;
}
// 根据下标生成(产生)listview中一行对应的视图
// getView()不会立即把所有数据项全部加载 只加载用户可见的数据项
// 当上面或下面的数据项因为上拉或下拉而退出屏幕的时候 系统回收该view
// 重新往回拉的时候 又再次调用getView()进行加载
// 合理的使用convertView --- 系统已经回收的view 可以拿来重新使用
// 如果刚开始时 没有已经回收的view 则convertView==null
// 正确的做法是 根据convertView是否为空来进行操作
// 1. 如果convertView==null 从系统中分配内容
// 2. 如果convertView!=null 直接拿convertView来使用
// 同时 把view中的控件作为附属包裹连接在view中(getTag()、setTag())
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 一行显示的view
View view = null;
// 模拟SimpleAdapter的做法 一行只显示两个TextView(封装在holder中)
ViewHolder holder = null;
// 判断convertView是否为空 并根据判断的结果进行不同的操作
if(convertView == null) {
// 从系统中分配内存作为view
// 通过LayoutInflater把布局转换成view
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
// new View()从系统中分配内存
view = inflater.inflate(android.R.layout.simple_list_item_2, null);
// 创建holder对象 从布局中找出textview(查找是很耗时间的)
holder = new ViewHolder();
holder.textview1 = (TextView) view.findViewById(android.R.id.text1);
holder.textview2 = (TextView) view.findViewById(android.R.id.text2);
// 把view与holder绑定在一起
view.setTag(holder);
} else {
// 直接拿convertView来使用
view = convertView;
// 把holder从view的绑定中提取出来(基本上不需要时间的)
holder = (ViewHolder) view.getTag();
}
// 给textview设置显示的内容
Map<String, Object> map = list.get(position); // 获得list中的map
String name = (String) map.get("name"); // map中根据key=name获取对应的值
holder.textview1.setText(name);
int age = (Integer) map.get("age"); // map中根据key=age获得对应的值
holder.textview2.setText(age+"");
Log.i("ListView", "getView: " + position
+ ", View is " + view
+ ", convertView is " + convertView);
return view;
}
// viewHolder是MyAdapter的内部类
// 负责把textview1和textview2进行简单的打包
class ViewHolder {
public TextView textview1;
public TextView textview2;
}
}
BaseAdapter自定义适配器的更多相关文章
- BaseAdapter自定义适配器——思路详解
BaseAdapter自定义适配器——思路详解 引言: Adapter用来把数据绑定到扩展了AdapterView类的视图组.系统自带了几个原生的Adapter. 由于原生的Adapter视图功能太少 ...
- Android中GridView通过自定义适配器(未优化)实现图文视图排列
Android中GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要显示时,可以使用该组件.下面我们通过代码实现如下图例(为了方便截图,将事件处理(土 ...
- 细解ListView之自定义适配器
下面我们将以一个例子来讲述ListView之自定义适配器 首先我们看一下效果图: [分析] 首先:需要创建一个ListView控件,自定义适配器是为了实现自定义ListView的ListView_It ...
- Android -- ListView(SimpleAdapter) 自定义适配器
aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA ...
- (转)Android之自定义适配器
ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果. 有这样一个Demo ...
- Android:自定义适配器
无论是ArrayAdapter还是SimpleAdapter都继承了BaseAdapter,自定义适配器同样继承BaseAdapter 实例:Gallery实现图片浏览器 <?xml versi ...
- 最简单的自定义适配器adapter
下面是一个非常简单的自定义适配器的总体源码,从这个源码入门,就可以慢慢学会适配器了 适配器的作用: 完成数据和界面控件的绑定,把数据绑定到界面的现实控件条目上(对于listView,应该是listVi ...
- 安卓开发_浅谈ListView(自定义适配器)
ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ...
- ListView的自定义适配器及其优化(listView序号混乱问题的处理)
ListView是最常使用的android组件之一,关于listView的优化问题刚刚了解了一些,在这里做出总结. PS:如果想让ListView中的item根据数据内容显示item的大小,需要在it ...
随机推荐
- Jni中C++和Java的参数传递 参数对照
Jni中C++和Java的参数传递 如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用V ...
- 详述Linux ftp命令的使用方法
转自:http://os.51cto.com/art/201003/186325.htm ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里 ...
- Ubuntu 12.04 安装 Chrome浏览器
1,先到chrome官网下载一个安装包 http://www.google.com/intl/zh-CN/chrome/ 2,ctrl+alt+t 打开终端. 3,在终端里输入sudo apt-get ...
- C++ 的语言杂谈(一)--C++不是新手友好的
C++的语言品味是独特的,喜欢的人特别喜欢,讨厌的人特别讨厌.虽然Bjane Stroustrup不断地宣称C++的发展方向是新手友好的,但实际上对新手来说,最重要的还是有强大方便的标准库可以使用(像 ...
- logback 项目应用
1.gradle引用: compile group: 'commons-logging', name: 'commons-logging', version: '1.1.3' compile grou ...
- ExtJS学习之路第七步:contentEl与renderTo的区别
上回在Panel的应用中我们应该能大致区分开conteEl和renderTo,这回我们从定义中区分. 在Panel的API中, contentEl:String指定一个现有的HTML元素或者id作为此 ...
- Entity Framework 关系约束配置
前言 简单的说一下自己的理解,大家应该都很明白ADO.NET,也就是原生态的数据库操作,直接通过拼接SQL语句,表与表之间通过链接(inner join left join 或者子查询),也就是在 ...
- SpringMVC利用拦截器防止SQL注入
引言 随着互联网的发展,人们在享受互联网带来的便捷的服务的时候,也面临着个人的隐私泄漏的问题.小到一个拥有用户系统的小型论坛,大到各个大型的银行机构,互联网安全问题都显得格外重要.而这些网站的背后,则 ...
- [Effective JavaScript 笔记]第31条:使用Object.getPrototypeOf函数而不要使用__proto__属性
ES5引入Object.getPrototypeOf函数作为获取对象原型的标准API,但由于之前的很多js引擎使用了一个特殊的__proto__属性来达到相同的目的.但有些浏览器并不支持这个__pro ...
- HTTP HSTS协议和 nginx
导读 Netcraft 公司最近公布了他们检测SSL/TLS网站的研究,并指出只有仅仅5%的用户正确执行了HTTP严格传输安全HSTS.本文介绍nginx如何配置HSTS. 什么是HSTS HTTPS ...