ListView 作为安卓中最常用以及最难用的一个控件,确实是一件光宗耀祖的事 下面我们扒拉扒拉他的先祖们
AbsListView --> AdapterView --> ViewGrop -- >View -->Object-->ListView
接下来分析一下这个伟大的ListView
一, 特点
1, 它是一个组件
2, 它继承自ViewGrop , 所以说它是一个容器
3, 它的列表项是由Adapter提供, 通过setAdapter(adapter);
4, 它包含多个列表项, 并且以列表的方式显示
二, 属性
android:divider = "" Item之间的颜色 可以是图片 , 颜色(#RGB)
android:dividerHeight = "" Item之间的间距
android:entries = "" 属性填充
三, 填充方式
1, 属性填充
step01: 在res/values/strings.xml中
<String-array anroid:name = "books">
<item>三国演义</item>
</String-array>
step02: 在控件中: <ListView android:entries = "@array/books"/>
2, ArrayAdapter
适用场景: Item中只有一行文本信息, 不能显示图片
数据源: String[] / List<String>
步骤:
step1: 得到控件并且初始化
step2: 得到数据源
step3: 定义适配器
step4: 为控件设置适配器
3, SimpleAdapter
适用场景:Item可以是图文混排, 图片是本地
数据源: List<Map<String,Object>>
步骤:
step1: 得到控件并且初始化
step2: 得到数据源
step3: 定义适配器
step4: 为控件设置适配器
4, BaseAdapter
适用场景: Item可以是图文混排, 图片可以是本地也可以是网络
数据源: List<模型类> List<Map<String,Object>>
步骤
step1: 得到控件并且初始化
step2: 得到数据源
step3: 定义适配器
step4: 为控件设置适配器
三, BaseAdapter
基本的适配器, 他是ArrayAdapter 和 SimpleAdapter 的父类
功能: 用于复杂数据的显示
用法:
1, 定义一个类型, 继承BaseAdapter
2, 重写父类的4个方法
int getCount() 返回数据源的总长度
Object getItem(int position) 返回当前下标对应的Item数据
long getItemId(int position) 返回当前下标对应视图的Id
View getView(int position,View convertView, ViewGroup parent) 返回每个Item的视图页面
{
//1, 得到布局容器加载器对象
LayoutInflater inflater = LayoutInflater.from(context);//常用
LayoutInflater inflater = getLayoutInflater();//在Activity中使用
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);//得到系统服务
//2, 加载布局
View view = inflater.inflate(布局页面, 父容器对象parent,固定值false);
//3, 得到布局中的控件
TextView tv = (TextView)view.findViewById(R.id.tv);
//4, 为控件设置内容
tv.setText(data.get(position));
return view;//每个Item的视图
}
四, 事件
1, OnItemClickListener 每个条目点击事件监听器
2, OnItemLongClickListener 每个条目长按事件监听器
返回值:
true 只有长按做处理
false 自己可以处理, 其他事件也可以监听
五, ListView 的优化
android中的优化
布局的优化: 在布局页面中减少嵌套
java代码的优化: 用面向对象的思想, 把相同的代码封装, 相同的功能,相同的特效都封装起来
栈内存的优化: 尽量不使用递归, 使用算法
堆内存的优化: 少创建对象, 能重复利用的对象则重复使用
ListView中的优化
1, 属性的优化:
宽度和高度都设置为match_parent getView方法只执行一次
wrap_content getView方法会进入多次,来计算ListView的宽度和高度
2, convertView的复用
前提: convertView的类型和新建的view 的类型是相同, 所以可以重用
优点: 减少创建对象的数量, 节省了资源, 降低内存的消耗, 提高性能
3, ViewHolder的使用
将控件的获取封装, 达到重用, 减少findViewById 的次数
六, ListView 的分页加载数据
滚动事件监听器
//滚动事件监听器
lv.setOnScrollListener(new OnScrollListener() {
/**
* 监听ListView 滚动状态改变的方法
*
* AbsListView view 当前ListView
* int scrollState 滚动的状态
*
* 一共有三种状态:
* SCROLL_STATE_TOUCH_SCROLL 1 ListView正在滚动, 并且手指依然在屏幕上
* SCROLL_STATE_FLING 2 惯性滑动
* SCROLL_STATE_IDLE 0 listView停止滚动
*
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
Log.i("info", "scrollState === " + scrollState);
// 1, 到达底部 2,停止滑动 --- 加载更多数据
}
/**
* 监听ListView 的滚动方法
*
* AbsListView view 当前的ListView
* int firstVisibleItem 当前屏幕最上方显示的Item的下标
* int visibleItemCount 当前屏幕显示的Item的数量(半个也算一个)
* int totalItemCount 所有Item的数量
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
boolean isLast = (firstVisibleItem +visibleItemCount == totalItemCount);
Log.i("info", "isLast --- " + isLast);
}
});
七, 多布局ListView
1, 添加头部视图 和 底部视图
头部视图
添加 lv.addHeaderView(View v)
移除 lv.removeHeaderView(View v)
底部视图
添加 lv.addFooterView(View v)
移除 lv.removeFooterView(View v)
2, 多布局(图灵机器人)
http://www.tuling123.com/openapi/api?key=be12dd3c0bac3654e78aa69e4b36a6dd&info=
适配器中:
int getViewTypeCount() 指定ListView中有几种布局
int getItemViewType() 返回当前要加载的是那种类型的视图
在getView() 方法中:
if(getItemViewType(position) == 1)
{
}else{
}