1.getView()界面每显示一行都会调用getview()方法

2.初始化数据

在getview()


lsitveiw复杂行布局的实现

1.创建行布局文件 Ctrl+N

2.getview()设置行布局文件

//1.获得布局转换器

LayoutInflaterinflater=getLayoutInflater();

//2.将行布局文件转换为View对象

Viewlayout=inflater.inflate(R.layout.list_item,null);

//3.查找行布局中的控件

TextViewtvTitle=(TextView)layout.findViewById(R.id.tv_title);

TextViewtvSubTitle=(TextView)layout.findViewById(R.id.tv_subtitle);

returnlayout;


使用自己创建的适配器对象

1.创建一个类继承BaseAdapter{重写四个方法}

2.使用

数据封装

1.创建一个类保存每一行的数据

成员变量类型 个数 取决于 行的控件所要保存的数据

创建带参的构造方法 get() set()


2.创建容器保存Data数据

ArrayList<Data>list=newArrayList<Data>();

3.初始化数据

4.getview()获得每一行的数据 Data


空指针

错误:

(TextView) findViewById(R.id.tv_subtitle);

正确:

(TextView)layout.findViewById(R.id.tv_title);




优化

1.复用行布局

只需要创建界面可见最多行的布局对象,其他界面不可见的行,复用界面消失的行布局


convertView:保存即将消失的行布局对象索引

注意:getview()中的变量不要声明为成员变量

1.//判断convertView是否为空

Viewlayout=null;

if(convertView==null){//convertView为空就创建界面可见最多行的布局对象

//获得布局转换器

LayoutInflaterinflater=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();菜单点击事件