1.getView()界面每显示一行都会调用getview()方法
2.初始化数据
在getview()
lsitveiw复杂行布局的实现
1.创建行布局文件 Ctrl+N
2.getview()设置行布局文件
//1.获得布局转换器
LayoutInflater inflater = getLayoutInflater();
//2.将行布局文件转换为View对象
View layout = inflater.inflate(R.layout.list_item, null);
//3.查找行布局中的控件
TextView tvTitle = (TextView) layout.findViewById(R.id.tv_title);
TextView tvSubTitle = (TextView) layout.findViewById(R.id.tv_subtitle);
return layout;
使用自己创建的适配器对象
1.创建一个类继承BaseAdapter{重写四个方法}
2.使用
数据封装
1.创建一个类保存每一行的数据
成员变量类型 个数 取决于 行的控件所要保存的数据
创建带参的构造方法 get() set()
2.创建容器保存Data数据
ArrayList<Data> list=new ArrayList<Data>();
3.初始化数据
4.getview()获得每一行的数据 Data
空指针
错误:
(TextView) findViewById(R.id.tv_subtitle);
正确:
(TextView) layout.findViewById(R.id.tv_title);
优化
1.复用行布局
只需要创建界面可见最多行的布局对象,其他界面不可见的行,复用界面消失的行布局
convertView:保存即将消失的行布局对象索引
注意:getview()中的变量不要声明为成员变量
1.//判断convertView是否为空
View layout =null;
if (convertView==null) {//convertView为空就创建界面可见最多行的布局对象
//获得布局转换器
LayoutInflater inflater = getLayoutInflater();
//将行布局文件转换为View对象
layout = inflater.inflate(R.layout.list_item, null);
}else {//convertView不为空,说明convertView保存了消失的行布局对象索引
就复用消失的行布局对象
layout=convertView;
}
优化二:减少控件查找次数
实现步骤:
1.创建ViewHolder类:保存查找到的控件的索引 (笔记)
2.保存查找到的控件索引 并且 为布局设置标签(保存viewHolder索引)
3.复用的行 只需要从标签里拿到控件的索引 不需要再次findviewbyid()
查找控件
ListView 数据更新
1.对容器进行操作
2.适配器通知ListView更新界面 通过调用mAdapter.notifyDataSetChanged();
Listveiw行点击事件
1.普通点击事件
2.长按点击事件
行点击事件失效
1.行布局中放入Button 控件抢占焦点
在抢占焦点的控件中设置: android:focusable="false"
在最外层布局设置:
android:descendantFocusability="blocksDescendants" >
1. 为Listview注册上下文菜单
registerForContextMenu(mListView);
2.设置长按点击事件 保存长按行的行号
3.重写onCreateContextMenu();
4.重写onContextItemSelected();菜单点击事件
转载于:https://blog.51cto.com/1206995290qq/1830799