如果要在ListView中展示一系列的item列表(都是相同的布局), 除了在资源文件中添加之外, 还可以用Adapter, 将数据放到ListView上展示出来. 那么, 我们就来介绍一下, Adapter和ListView是如何一起工作的.
使用SimpelAdapter
可以控制一些复杂的布局.
通过观察它的参数列表我们可以发现, 它的参数是有要求的.
第一个参数是Context, 第二个是一个List. 但是这个List的泛型是要求的, 必须是一个Map或者是Map的子类, 而这个Map的键必须是String, 值的类型不限. 第三个是String数组(拿到数据, Map中的key), 第四个是int数组(放到某个控件上, 控件的id), 可以达到一一对应的关系.
new一个Adapter:
SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2,
new String[]{"title", "body"},
new int[]{android.R.id.text1, android.R.id.text2});
使用BaseAdapter
使用继承BaseAdapter的方式时至少有两个属性: 一个上下文(Context), 一个是数据源的对象. 另外还有一个是数据文件的id.
BaseAdapter中的getView方法
在ListView中, 如果它的item列表是相同的布局, 那么, 它的item是可以重复利用的(上面消失的item, 重新利用到下面新出现的item), 那么, 消失的那个item就会传入convertView, 减少加载布局的次数.这是对ListView的优化
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null){
convertView = inflater.inflate(R.layout.item, parent, false);
convertView.setTag(new ViewHolder(convertView));
}
ViewHolder holder = (ViewHolder) convertView.getTag();
Entry entry = list.get(position);
holder.text.setText(entry.getText());
new ImageLoader(holder.image).execute(entry.getImgUrl());
return convertView;
}
finViewById 操作
这层级比较深的时候, 这也是一个耗时操作. 所以我们要尽量减少使用这种方法.
所以, 我们可以写一个方法, 来保存这些控件. 不用每次都去findViewById.
public static class ViewHolder{
private ImageView image;
private TextView text;
private ViewHolder(View itemView){
text = (TextView) itemView.findViewById(R.id.item_text);
image = (ImageView) itemView.findViewById(R.id.item_image);
}
}
在这里我们就可以得到所有要用的控件, 并且不用每次都去调用findViewById.