About ListView
这一篇整理一些ListView的基本知识。
PartA翻译自API Guide:
(A)API Guide
使用Adapter建立(bind)Layout
当layout内容是动态的或者不是预先决定好的,可以使用AdapterView的子类动态完成layout的填充。
AdapterView的子类使用Adapter来bind data到它的layout里面。Adapter的角色是数据源和AdapterView layout的中间人——Adapter从数组、数据库等处取出数据然后把每个条目转换成可以加进AdapterView layout的一个view。
用数据填充Adapter
你可以通过给Adapter建立AdapterView的形式来填充ListView、GridView等AdatperView。这个操作会把外部数据建立成一个view,每一个view代表一个数据条目。
Android提供很多Adapter的子类来给AdapterView获取数据、建立view。两种最常见的adapter是:
ArrayAdapter
当你的数据源是array(数组)的时候使用这个adapter。默认地,ArrayAdapter通过对每个list item调用toString()并且把内容放进TextView中来为每个array item建立一个view。
例如,当你有一个字符串数组想要展示在ListView里面,用构造函数来初始化一个新的ArrayAdapter并且为每个string和string array指定一个latyout。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
构造函数的参数是:
- App Context
- 一个包含了为数组中的每个string准备了TextView的layout
- 字符串数组
然后只要在你的ListView中调用setAdapter():
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
为了自定义每个item的外观,你可以为你的数组对象复写(override)的toString()方法。或者建立一个不是TextView的view比如ImageView,继承ArrayAdapter类并且复写getView()来反悔你想为每个item准备的view类型。
SimpleCursorAdapter
当你的数据来自Cursor的时候使用这个adapter。使用SimpleCursorAdapter,你必须为Cursor中的每一行指定一个layout。例如,如果你想建立一个包含了人名和电话号码的表,你可以使用一个返回Cursor的查询(query),Corsor中一行对应一个人,列则对应人名和电话号码。然后你建立一个字符串数组来指定Cursor中的哪些列你想要放置到result的layout里面,建立一个integer数组来指定列应该被放置到的对应的view:
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER};
int[] toViews = {R.id.display_name, R.id.phone_number};
When you instantiate the SimpleCursorAdapter
, pass the layout to use for each result, the Cursor
containing the results, and these two arrays:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);
ListView listView = getListView();
listView.setAdapter(adapter);
-
The
SimpleCursorAdapter
then creates a view for each row in theCursor
using the provided layout by inserting eachfromColumns
item into the correspondingtoViews
view..
If, during the course of your application's life, you change the underlying data that is read by your adapter, you should call notifyDataSetChanged()
. This will notify the attached view that the data has been changed and it should refresh itself.
处理点击事件
你可以通过实现AdapterView.OnItemClickListener接口来处理点击AdapterView中每个条目的点击事件。比如:
// Create a message handling object as an anonymous class. private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { // Do something in response to the click } }; listView.setOnItemClickListener(mMessageClickedHandler);
(B)eoe
1)ArrayAdapter
listview在findViewById获取布局之后,可以用setAdapter()方法添加元素,它的参数是ListAdapter,子类有很多,比如ArrayAdapter<T> 、CursorAdapter、BaseAdapter等等。
*三种Adapter的数据源不同
1. String[]: ArrayAdapter
2. List<Map<String,?>>: SimpleAdapter
3. 数据库Cursor: SimpleCursorAdapter
ArrayAdapter<String> adapter;//生成对象
adapter = new ArrayAdapter<String>(this,R.layout.listcell);//这里的第二个参数中的列表必须是TextView
array.add("Hello");//取决于前面的泛型
array.add("there");
然后介绍了自定义一个类作为泛型里的类型,ListCellData,里面有get set方法,然后在adapter里像下面这样初始化:
adapter.add(new ListCellData("小明","男","17"));
之后发现返回的是乱码,说是因为这里返回的是函数的toString()方法的返回值(构造函数没有返回值,但是每个类的父类Object有一个toString()方法可以重写)。
于是:
@override
public String toString(){
return this.getUserName(); //
}
然后介绍了lv.setOnItemClickListener(this)绑定监听器的方法。之前为什么要定义ListCellAdapter?这里体现出来:
可以返回自定义的类型,然后去get类中的变量。这样的话比如一条答案,可以把他们所有的属性封装成一个数据类型,list.add的时候add要显示的内容。
这里的position似乎很智能,似乎之前的add是一个队列,跟这里position顺序都是一一对应的。
2)用BaseAdapter自定义复杂列表
初始化一个BaseAdapter对象,它复写了getView(), getItemID(), getItem(), getCount()。
getView()只要在需要呈现列表项的时候都会被执行。
在getView()里需要创建一个视图来返回。这里返回一个textview。
getView()什么时候执行?如果在getView()里println,会发现每当显示新的item的时候,getView就会执行一次,创建一个textView。当有几百个list item的时候,这样很耗内存。
所以,要用getView的第二个参数,convertView。
convertView的意思是,当listview里的item滑出屏幕之后,view就会变成一个convertView。所以可以在convertView不为空的时候(有view滑出屏幕了),不创建新的view,而是先用convertView(这样是不是实现了只需要创建屏幕上显示的那么多个view就行了呢)。下图中注意new TextView中传的参数就是所在的类的名字。
图:convertView的示例
下面,实现一个能够呈现出图片的列表。于是新建一个customer_list_cell.xml列表项。里面有ImageView、TextView等等需要自己布局。
然后,数据要建立一个独立的类。一般要有set get方法。用构造函数给这个类里的变量传值。
接下来要实现getView()。同样重用convertView。给内部的子对象重新赋值,否则会发现后面的item跟以前会重复。
然后是在自定义的LL里面findViewById,从以前创建的LL内部查找。这一点要好好体会一下。
好了,功能完成了,但是真实开发过程不建议用BaseAdapter的匿名内部类实现。要把类之间的耦合度降低,以便写大工程。
创建一个类继承自BaseAdapter。
传Context进来。 接下来介绍了ListActivity。如果为ListActivity创建一个布局xml文件,那么这个布局文件内部必须有一个listview并且它的ID必须指定为:android:id="@android:id/list"。
About ListView的更多相关文章
- 张高兴的 UWP 开发笔记:横向 ListView
ListView 默认的排列方向是纵向 ( Orientation="Vertical" ) ,但如果我们需要横向显示的 ListView 怎么办? Blend for Visua ...
- Android—万能ListView适配器
ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...
- Android—ListView条目背景为图片时,条目间距问题解决
ListView是android开发中使用最普遍的控件了,可有的listView条目的内容颇为丰富,甚至为了美观,背景用指定图片,如下图:
- Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)
昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...
- listview下拉刷新和上拉加载更多的多种实现方案
listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局 android系统为listview提供了addfootview ...
- Android listview和gridview以及view的区别
GridView 可以指定显示的条目的列数. listview一般显示的条目的列数都是一列 如果是列表(单列多行形式)的使用ListView,如果是多行多列网状形式的优先使用GridView andr ...
- mono for android Listview 里面按钮 view Button click 注册方法 并且传值给其他Activity 主要是context
需求:为Listview的Item里面的按钮Button添加一个事件,单击按钮时通过事件传值并跳转到新的页面. 环境:mono 效果: 布局代码 主布局 <?xml version=" ...
- 【腾讯Bugly干货分享】跨平台 ListView 性能优化
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...
- android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)
第三节(2):常用控件之ViewPager.日期时间相关.ListView 一.ViewPager 实例:结合PagerAdapter滑动切换图片 二.日期时间相关:AnalogClock\Dig ...
- 父ListView嵌套子ListView时点击事件没有响应
转发请备注出处:http://www.cnblogs.com/LT5505/p/5972999.html 问题: 在ListView中嵌套ListView之后,子ListView会把父ListView ...
随机推荐
- 16进制颜色转换为UIColor
objc #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >& ...
- iOS 一些struct类型的NSLog输出
我们经常会输出一些坐标尺寸信息之类的,比如view的frame,是CGRect类型的,用frame.oringial.x 和frame.size.width来做NSLog参数好麻烦,还好苹果对这些常用 ...
- Python Flask 在Sina App Engine (SAE)上安家
早就听说了Python的大名,随着的编程语言的理解加深,越发认为动态语言的威力--真大呀. 趁这段时间不忙,我也用Python写了一个应用,而且将其部署到Sina App Engine (SAE).S ...
- 【甘道夫】Hadoop2.2.0 NN HA具体配置+Client透明性试验【完整版】
引言: 前面转载过一篇团队兄弟[伊利丹]写的NN HA实验记录,我也基于他的环境实验了NN HA对于Client的透明性. 本篇文章记录的是亲自配置NN HA的具体全过程,以及全面測试HA对clien ...
- mini2440裸机试炼之——Uart与pc端实现文件、字符传输
1. 波特率(Baud rate)即调制速率,1波特即指每秒传输1个符号. 2. 非FIFO模式,即数据传输不利用FIFO缓存,一个字节一个字节地传输. 3. 位能够用来推断发送缓存器中是否为空 ...
- 12306 外包给阿里巴巴、IBM 等大企业做是否可行?
知乎上看到的,转载过来,雅俗共赏 12306首秀被骂的狗血喷头后铁道部找来IBM.阿里巴巴等大企业要解决方式,给出的条件是资金管够可是问题得解决. 几大企业最后都拒绝了(当中阿里巴巴最后负责了排队系统 ...
- php部分--头像上传预览
前台页面显示 <style type="text/css"> #yl{ width:200px; height:300px; background-image:url( ...
- 【BZOJ4619/3709】[Wf2016]Swap Space/[PA2014]Bohater 贪心
[BZOJ4619][Wf2016]Swap Space Description 你有许多电脑,它们的硬盘用不同的文件系统储存数据.你想要通过格式化来统一文件系统.格式化硬盘可能使它的容量发生变化.为 ...
- EasyNVR H5无插件摄像机直播解决方案前端解析之:如何在播放界面添加实时云台控制界面
如何在播放器上加一个云台控制界面 问题: 对于实时直播的视频播放, 由于播放页面客观样式要求(一个播放器占据了整个页面),因此很难找出很合理的空间来放置其他功能按钮的位置(比如配合实时是平的云台控制界 ...
- 高德地图API开发二三事(一)如何判断点是否在折线上及引申思考
最近使用高德地图 JavaScript API 开发地图应用,提炼了不少心得,故写点博文,做个系列总结一下,希望能帮助到LBS开发同胞们. 项目客户端使用高德地图 JavaScript API,主要业 ...