ListView 组件
作用:使用ListView组件 绘制出漂亮的列表
Adapter适配器
- 只有通过Adapter才可以把列表中的数据映射到ListView中
- 在android的开发中最Adapter 一共可以分为
ArrayAdapter,BaseAdapter,CursorAdapter,HeaderViewListAdapter,
ResourceCursorAdapter,SimpleAdapter,SimpleCursorAdapter,WrapperListAdapter - 软件开发中最常用的有ArrayAdapter
, BaseAdapter, SimpleAdapter
使用ArrayAdapter
用ArrayAdapter可以实现简单的ListView的数据绑定。默认情况下,ArrayAdapter绑定每个对象的toString值到layout中预先定义的TextView控件上。
使用步骤
- 定义一个数组来存放ListView中item的内容。
- 通过实现ArrayAdapter的构造函数来创建一个ArrayAdapter的对象。
- 通过ListView的setAdapter()方法绑定ArrayAdapter。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv=(ListView) findViewById(R.id.lv);
//简单设置测试字符数组
String []data ={"hi","nihao","yes","no"};
ArrayAdapter array=new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1,data);
lv.setAdapter(array);
}
}
注:android.R.layout.simple_list_item_1是系统定义好的布局文件,它只显示一行文字
使用SimpleAdapter
SimpleAdapter(Context context, List extends Map
参数context:上下文,比如this。关联SimpleAdapter运行的视图上下文
参数data:Map列表,列表要显示的数据,这部分需要自己实现,如例子中的getData(),类型要与上面的一致,每条项目要与from中指定条目一致
参数resource:ListView单项布局文件的Id,这个布局就是你自定义的布局了,你想显示什么样子的布局都在这个布局中。这个布局中必须包括了to中定义的控件id
参数 from:一个被添加到Map上关联每一个项目列名称的列表,数组里面是列名称
参数 to:是一个int数组,数组里面的id是自定义布局中各个控件的id,需要与上面的from对应
使用步骤
- 根据需要定义ListView每行所实现的布局。
- 定义一个HashMap构成的列表,将数据以键值对的方式存放在里面。
- 构造SimpleAdapter对象。
- 将LsitView绑定到SimpleAdapter上。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv=(ListView) findViewById(R.id.lv);
SimpleAdapter simple=new SimpleAdapter(this, getData(),
R.layout.list_view_item, new String[]{"key1","key2"}, new int[]{R.id.textView1,R.id.textView2});
lv.setAdapter(simple);
}
private ArrayList
使用BaseAdapter
当SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖。
这时候最方便的方法就是使用灵活的适配器BaseAdapter了。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv=(ListView) findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter() {
//每个item要显示在lv上的时候,会被调用的方法,安卓系统调用
// position 当前的item处于第几个位置
// convertView 用于做优化
// parent 当前的父控件
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=View.inflate(MainActivity.this, R.layout.list_view_item, null);
TextView tv1=(TextView) view.findViewById(R.id.textView1);
tv1.setText("我是第:"+position+"个");
return view;
}
//这个方法是最开始被调用的,用来计算到底有多少个item需要显示在lv上
@Override
public int getCount() {
// TODO Auto-generated method stub
return 20;
}
});
}
}
优化方法 convertView 重用对象
1.通过缓存convertView实现
- 这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
View view = View.inflate(MainActivity.this, R.layout.list_view_item, null);
TextView tv1 = (TextView) view.findViewById(R.id.textView1);
tv1.setText("我是最屌的");
return view;
}
return convertView;
}
2.通过convertView+ViewHolder来实现
- ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。
- 代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。
//静态ViewHolder类
public static class ViewHolder {
public TextView title;
public TextView info;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
View view = View.inflate(MainActivity.this, R.layout.list_view_item, null);
holder.title=(TextView) view.findViewById(R.id.textView1);
// TextView tv1 = (TextView) view.findViewById(R.id.textView1);
holder.title.setText("我是最屌的");
view.setTag(holder);
return view;
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText("我是最屌的");
return convertView;
}