ListView的深入学习
ListView通常有两个职责:
将数据填充到布局 ; 处理用户的点击选择操作
二。创建ListView需要3个元素
ListView的每一列的View
View的数据或者图片
连接数据与ListView的Adapter
三。常用的适配器
|
Adapter |
含义 |
|
ArrayAdapter<T> |
用来绑定一个数组,支持泛型操作 |
|
SimpleAdapter |
用来绑定在xml中定义的控件对应的数据 |
|
SimpleCursorAdapter |
用来绑定游标得到的数据 |
|
BaseAdapter |
通用的基础适配器 |
四,ArrayAdapter
代码:
String[] str=new String[]{"1","2","3"};
lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,str) );
五。SimpleAdapter
代码:
ArrayList<HashMap<String,Object> > listItem=new ArrayList<HashMap<String,Object> >();
for(int i=0;i<10,i++){
HashMap<String ,Object> map=new HashMap<String,Object>();
map.put("ItemImage",R.drwaable.icon);
map.put("ItemTitle","第"+i+“行”);
map.put("ItemText",i+"行");
listItem,add(map);
}
//this,存放的数据,每一行的布局,动态数组中的数据源的键对应到布局view中
SimpleAdapter smadapter=new SimpleAdapter(this,listItem,R.layout.item,
new String[]{" ItemImage","ItemTitle","ItemText"}
new int[]{R.id.ItemImage,R.id.ItemTitle,R.id.ItemText});
lv.setAdapter(smadapter);
主意:使用SimpleAdapter一般都是用HashMap构成的列表,列表的每一节对应LisView的每一行。通过SimpleAdapter的构造函数,将HashMap的每个键的数据映射到布局文件的控件上
六。BaseAdapter
在ListView的使用中,还需要加入按钮等空间,实现单独的操作,用SimpleAdapter无法获取焦点,点击操作会被ListView的item覆盖,所以用到来Baseadapter。
使用BaseAdapter必须写一个类来继承它,以为它是一个抽象类,重写4个方法,最重要的方法是getView();
当开始绘制ListView的时候,首先调用getCount()方法,得到它的返回值,即listView的长度;
然后调用getView()方法,根据长度逐一绘制ListView的每一行;
然后getItem()和getItemId()在需要处理和取得Adapter中的数据时调用
代码:
//创建MyApdater继承BaseAdapter
MyAdapter mAdapter=new MyAdapter(this);
lv.setAdapter(mAdapter);
lv.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?>arg0,View arg1,int arg2,long arg3){
log.v("你点击了"+arg2);
}
});
//方法:得到数据
private ArrayList<HashMap<String,Object> >getDate(){
ArrayList<HashMap<String,Object> > listItem=new ArrayList<HashMao<String,Object> >();
//为动态数组添加数据
for(int i=0,i<10,i++){
HashMap<String ,Object> map=new HashMap<String,Object>();
map.put("ItemTitle","第"+i+"行");
map.pt("ItemText","第'+i+"行");
listItem.add(map);
}
return listItem;
}
//BaseAdapter的实体类MyAdapter
private class MyAdapter extends BaseAdpater{
//得到一个LayoutInfalter对象来导入布局
private LayoutInflater mInflater;
public MyAdapter(Context context){
this.mInflater=LayoutInflater.from(context);
}
// 重写的方法
public int getCount(){
return getDate().size(); //返回数组的长度
}
public Object getItem(int position){
return null;
}
public long getItemId(int position){
return 0;
}
//重写最重要的方法
pubic View getView(final int position,View convertView,ViewGroup parent){
ViewHolder holder;
//观察convertView随listVIew的滚动情况
Log.v("my","getView"+position+"---"+convertView);
if(convertView==null){
convertView=nInflater.inflate(R.layout.item,null);
holder=new ViewHolder();
// 实力化控件
holder.title=(TextView)convertVIew.finViewByid(R.id.xxx);
holder.text=(TextView)convertVIew.finViewByid(R.id.xxx);
holder.tbutton=(Button)convertVIew.finViewByid(R.id.xxx);
convertView,setTag(holder); //绑定ViewHolder对象
}else{
//取出ViewHolder对象,ViewHolder在下面有定义
holder=(ViewHolder)contretView.getTag();
//设置TextVIew显示的内容,即我们存放在动态数组中的数据
holder.title.setText(getDate().get(position).get("ItemTitle").toString());
holder.text.setText(getDate().get(position).get("ItemText").toString());
/*为Button添加点击事件*/ holder.bt.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
Log.v("MyListViewBase", "你点击了按钮" + position); //打印 Button的点击信息
}
});
return convertView;
}
}
//存放数据的ViewHolder
public final class ViewHolder{
public TextView title;
public TextView text;
public Button bt;
}
}

主意:
代码中getView()方法不容易理解。其实完全可以不用所谓的convertView和ViewHolder,直接导入布局并且设置控件显示的内容就可以了。但是这意味着有多少行数据就需要绘制多少行ListView,这显然是不可取的。这里采用了一种优化的方法。代码中,在getView()方法中加入了一行log输出convertView的内容。
从图4-38中可以看出,当启动Activity呈现第一屏ListView的时候,convertView为零。当用户向下滚动ListView时,上面的条目变为不可见,下面出现新的条目。这时候convertView不再为空,而是创建了一系列的convertView的值。当又往下滚一屏的时候,发现第11行的容器用来容纳第22行,第12行的容器用来容纳第23行。也就是说convertView相当于一个缓存,开始为0,当有条目变为不可见,它缓存了它的数据,后面再出来的条目只需要更新数据就可以了,这样大大节省了系统资料的开销。
还可以继续优化。虽然重复利用了已经绘制的view,但是要得到其中的控件,需要在控件的容器中通过findViewById的方法来获得。如果这个容器非常复杂,这显然会增加系统资源的开销。在上面的例子中,引入了Tag的概念。或许不是最好的办法,但是它确实能使ListView变得更流畅。代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。
ListView的深入学习的更多相关文章
- Android之ListView——ArrayAdapter的学习与总结
问题:当ListView选定的ListItem视图中存在一些UI组件,如CheckBox,希望保存状态,但实际上第一次完成时发现勾选后的选项在列表往下滑再滑回去后,状态没有保存 解决过程: 1)思考后 ...
- 43.Android之ListView中BaseAdapter学习
实际开发中个人觉得用的比较多是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gallery.Spinner ...
- android ListView 中getview学习总结
最近在做android相关的开发,ListView中有一个图片错位的问题,今天查了很多人写的一些东西,所以记录下来,算是一种加深理解吧. ListView是一个非常常用的控件,功能可以扩展的很丰富,而 ...
- Android列表视图ListView和ListActivity-android学习之旅(二十四)
ListView简介 ListView是android中常用的一种控件,创建ListView有两种方式: 1.在xml中使用ListView控件创建. 2.使用activity继承ListActivi ...
- android ListView 与GridView 学习总结(五)
ListView的使用总结 基本使用: 步骤:在布局文件中定义一个ListView控件-在活动中获得ListView的实例-获得适配器adapter的实例并且传入三个参数-把适配器对象传递给lis ...
- 38.Android之ListView简单学习(一)
android中ListView用的很普遍,今天来学习下,本篇主要以本地数据加载到listview,后面会学习从网络获取数据添加到listview. 首先改下布局文件: <?xml versio ...
- Android学习系列(17)--App列表之圆角ListView(续)
http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)- ...
- android学习系列:jercy——AI3 的博客
[android学习之十七]——特色功能2:桌面组件(快捷方式,实时文件夹) 二.桌面组件 1.快捷方式 Android手机上得快捷方式的意思可以以我们实际PC机器上程序的快捷方式来理解.而andro ...
- Android零基础入门第37节:初识ListView
原文:Android零基础入门第37节:初识ListView 之前我们学习的一些UI组件都比较简单,但是在实际开发中,会经常遇见列表界面设计,如通讯录.电话列表.信息列表等.那么从本节开始来详细学习列 ...
随机推荐
- Android MVP理解
Android默认采用的是MVC: View:对应于布局文件 Model:业务逻辑和实体模型 Controllor:对应于Activity 但是却存在很多问题: 1.这个View对应于布局文件,其实能 ...
- 编解码-java序列化
大多数Java程序员接触到的第一种序列化或者编解码技术就是Java的默认序列化,只需要序列化的POJO对象实现java.io.Serializable接口,根据实际情况生成序列ID,这个类就能够通过j ...
- 车销 商场 批发零售无线POS开单 智能POS开单打印 开单APP应用-云POS扫描打印一体方案
PDA数据采集器,是一款移动手持开单设备,它通过WIFI和GPRS连接并访问电脑,从进销存软件中读取数据,实现移动开单,打破电脑开单模式. 它自带扫描器,可直接扫描条码来查找产品,且功能强大.操作简单 ...
- 04 DOM一窥
BOM 浏览器对象模型 * window alert(); 弹出框 confirm() 询问框 setInterval("run()",1000); 每隔1秒执行run ...
- TestNg依赖配置基础用法(单一方法依赖)------TestNg依赖详解(一)
TestNg依赖测试之简单方法依赖,通过dependsOnMethods属性来配置依赖方法 原创文章,版权所有,允许转载,标明出处:http://blog.csdn.net/wanghantong J ...
- "Accepted today?"[HDU1177]
"Accepted today?" Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- [WP8.1UI控件编程]Windows Phone理解和运用ItemTemplate、ContentTemplate和DataTemplate
2.2.5 ItemTemplate.ContentTemplate和DataTemplate 在理解ItemTemplate.ContentTemplate和DataTemplate的关系的之前,我 ...
- UVA 11609 - Teams(二项式系数)
题目链接 想了一会,应该是跟二项式系数有关系,无奈自己推的式子,构不成二项式的系数. 选1个人Cn1*1,选2个人Cn2*2....这样一搞,以为还要消项什么的... 搜了一下题解,先选队长Cn1,选 ...
- Install the Maven in your computer
While, this blog will talk about installing the Maven in your computer. There are three steps as fol ...
- Spring MVC过滤器-字符集过滤器(CharacterEncodingFilter)
spring的字符集过滤通过用于处理项目中的乱码问题,该过滤器位于org.springframework.web.filter包中,指向类CharacterEncodingFilter,Charact ...