初探使用继承BaseAdapter的自定义adapter去适配ListView

要做什么:在一个activity中展示一个ListView柴犬列表,包含imageView和一个TextView

需要准备:

1、在哪个界面展示ListView,即一个activity

2、一个继承了BaseAdapter的子类dogAdapter

3、一个Dogs实体类

4、item的布局(一个item中包含了一个imageView和一个TextView)

 

重点在于适配器dogAdapter:

定义参数:上下文Context、int类型的布局资源、数据(List);用来接收调用构造器传进来的参数

构造函数:将参数传进来,带有上下文Context、item布局资源id、数据(即要展示的柴犬列表)

覆写4个方法:getCount、getItem、getItemId、getView

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

重点在于getView:

没有优化的基础版:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
//通过方法LayoutInflater.from(context)构建出一个LayoutInflater对象,然后调用inflate动态加载一个布局
//inflate方法里有3个参数:依次是item的布局、父布局、最后一个boolean是表明不让这个view添加父布局
    convertView = LayoutInflater.from(context).inflate(R.layout.dogitem,parent,false);
//定义imageView和textView,对应的是item的布局控件id
//item布局中的
    ImageView imageView = convertView.findViewById(R.id.IV);
    TextView textView = convertView.findViewById(R.id.TV);
    imageView.setImageResource(list.get(position).getImageId());
    textView.setText(list.get(position).getName());
    return convertView;
}

============================================================================

做过两处优化的版本:

①已加载过的item布局保存下来,在下一次展示时直接取,而不再调多一次inflate

②将布局控件缓存,在下一次展示时不再调findViewById

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        ViewHolder viewHolder;
        if(convertView == null){
    //当convertView为空时,只调一次inflate去加载布局
            view = LayoutInflater.from(context).inflate(R.layout.dogitem,parent,false);
    //实例viewHolder,传入ImageView、textView
            viewHolder = new ViewHolder();
            viewHolder.ImageView = view.findViewById(R.id.IV);
            viewHolder.textView = view.findViewById(R.id.TV);
    //view.setTag(viewHolder);缓存
            view.setTag(viewHolder);
        }
        else {
            view = convertView;
    //getTag();取出
            viewHolder = (ViewHolder)view.getTag();
        }
    //list中的第get(position)个的名字getName()
        viewHolder.textView.setText(list.get(position).getName());
        viewHolder.ImageView.setImageResource(list.get(position).getImageId());
        return view;
    }

    //当屏幕中只显示7个item时,显示第1~7个item,每一个item都调用了findViewById,此时看不到第8、9个item
    //往下滑动到底,显示第3~9个item,此时第8、9个item都调用了findViewById,此时看不到第1、2个item
    //再往上滑动到顶,显示第1~7个item,此时第1、2个item又再一次调用了findViewById,此时看不到第8、9个item
    //这个类用来缓存资源;
    class ViewHolder{

        ImageView ImageView;
        TextView textView;
    }
}

你可能感兴趣的:(Android菜鸡)