作用:使用ListView组件 绘制出漂亮的列表
用ArrayAdapter可以实现简单的ListView的数据绑定。默认情况下,ArrayAdapter绑定每个对象的toString值到layout中预先定义的TextView控件上。
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(Context context, List
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
当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;
}
});
}
}
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;
}