要做什么:在一个activity中展示一个ListView柴犬列表,包含imageView和一个TextView
需要准备:
1、在哪个界面展示ListView,即一个activity
2、一个继承了BaseAdapter的子类dogAdapter
3、一个Dogs实体类
4、item的布局(一个item中包含了一个imageView和一个TextView)
重点在于适配器dogAdapter:
定义参数:上下文Context、int类型的布局资源、数据(List<dog>);用来接收调用构造器传进来的参数
构造函数:将参数传进来,带有上下文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;
}
}