1.定义自己的实体类来作为ListView的适配类型如:
public class Fruit { private String name;//水果的名字 private int imageId;//水果的图片资源 public Fruit(String name,int imageId) { this.name=name; this.imageId=imageId; } public String getName() { return name; } public int getImageId() { return imageId; } }
2.新建一个布局页面(在layout文件夹下放入fruit_item.xml)其中加入一个imageView控件显示图片,再加入一个TextView显示名字
3.自定义一个适配器类,此类继承ArrayAdapter并将此类的泛型指定为Fruit接受刚刚的Fruit类
public class FruitAdapter extends ArrayAdapter{ private int resourceId; public FruitAdapter(Context context, int textViewResourceId, List objects)//重写了getView的方法可以将上下文,ListView的布局的id和数据传进来 { super(context,textViewResourceId,objects);//就是这三个东西 resourceId=textViewResourceId; } @Override public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit=getItem(position);//在每个子项被滚到屏幕内时调用这个方法,获取这个水果的实例 View view= LayoutInflater.from(getContext()).inflate(resourceId,parent,false);//传入利用inflate传入布局此方法含有三个参数第三个参数指不让此布局在此界面中生效, ImageView fruitImage=(ImageView)view.findViewById(R.id.fruit_image);//在刚刚获取到的布局中,再获取listVIew和ImageView TextView fruitName=(TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId());//将图片和名字放入其中 fruitName.setText(fruit.getName()); return view;//返回布局
} } 4.在主方法中写一个初始化Fruit类的函数传入各种数据 将适配器实例化传入三参 蒋listView实例化将适配器传入
private void initFruits() 5对于ListView的优化 1.对于滚动时不断调用getView()方法的优化 调用convertView方法来缓存布局 Fruit fruit=getItem(position);
View view; if(convertView==null) { view=LayoutInflater.from(getContext()).inflate(resourceId,parent,false); } else{ view=convertView; }
判断ConverView是否为空,不空就直接重用,空的话就去加载布局 2.第二个优化,对于getView中的findViewById()方法重复调用,借助ViewHolder来优化 ViewHolder是一个内部定义的类将控件的实例都放在Viewholder里.并借用setTag()方法来放入View中,也就是所有的实例都保存在viewHolder中