安卓ListView三种Adapter实践
主体页面
ArrayAdapter 效果
SimpleAdapter效果
BaseAdapter效果及其解释
BaseAdapter三种实现方法日志文件展示
方法一
很明显,第一种方法对于每个item框图都会调用一次getView方法,重新mInflater.inflate一个新的对象,此时随着列表的下拉,整体的速度会显著下降。 原本创建的itemView会直接被销毁,滑动到对应的列表项时会重新进行创建。
public View getView(int position, View convertView, ViewGroup parent) {
View itemview = mInflater.inflate(R.layout.listview_item_bt,null);
// 创建一个视图对象,存放item
ImageView img = (ImageView)itemview.findViewById(R.id.album_thumb);
TextView title = (TextView)itemview.findViewById(R.id.album_title);
TextView info = (TextView)itemview.findViewById(R.id.album_info);
ImageButton btn =(ImageButton)itemview.findViewById(R.id.album_btn);
// 获取id,存放在item之中
HashMap<String,Object> data = mData.get(position);
/// hashmap存放的数据进行获取
img.setImageResource((Integer)data.get("thumb"));
title.setText(data.get("title").toString());
info.setText(data.get("info").toString());
// 设置该位置的item
Log.e("BaseAdapter",position + itemview.toString());
return itemview;
}
日志文件
方法二
该方法采用convertView存放之前的View对象,减少对象的创建,实现复用,列表的创建和布局刷新时间会大大减少,但是重复调用getView方法,获取id也需要大量时间。
@Override
//方法二
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null)
convertView = mInflater.inflate(R.layout.listview_item_bt,null);
// 如果为空就创建 否则直接复用之前的View对象
ImageView img = (ImageView)convertView.findViewById(R.id.album_thumb);
TextView title = (TextView)convertView.findViewById(R.id.album_title);
TextView info = (TextView)convertView.findViewById(R.id.album_info);
ImageButton btn =(ImageButton)convertView.findViewById(R.id.album_btn);
HashMap<String,Object> data = mData.get(position);
img.setImageResource((Integer)data.get("thumb"));
title.setText(data.get("title").toString());
info.setText(data.get("info").toString());
Log.e("BaseAdapter2",position+convertView.toString());
return convertView;
}
方法三
创建一个ViewHolder类,实现对于所有空间对象的保留,使得所有的对象id不必重复获取,在方法二的基础之上,效率更高
此时的item对象会重复利用,往下拉的同时,新的图片和数据项会覆盖之前上方的itemView对象,重新显示在下方。
public final class ViewHolder{
public ImageView album_thumb;
public TextView album_title;
public TextView album_info;
public ImageButton album_btn;
View wholesView;
}
/// 自定义内部类,用于对子项控件的实例进行缓存。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null) {
convertView = mInflater.inflate(R.layout.listview_item_bt, parent,false);
// 可以被重用的视图 两个参数 第一个参数就是 分布的资源id 第二个就是填充的根视图
holder = new ViewHolder();
//
holder.album_thumb = (ImageView) convertView.findViewById(R.id.album_thumb);
holder.album_title = (TextView) convertView.findViewById(R.id.album_title);
holder.album_info = (TextView) convertView.findViewById(R.id.album_info);
holder.album_btn = (ImageButton) convertView.findViewById(R.id.album_btn);
holder.wholesView = convertView;
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
HashMap<String,Object> data = mData.get(position);
holder.album_thumb.setImageResource((Integer)data.get("thumb"));
holder.album_title.setText(data.get("title").toString());
holder.album_info.setText(data.get("info").toString());
holder.album_btn.setTag(position);
//Log.e("BaseAdapter3",convertView.toString());
/// 强调复用
holder.album_btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
showInfo(position);
}
});
Log.e("BaseAdapter3",position+":"+convertView.toString());
return convertView;
}