这里我们通过代码及注释来详细说明一下ListView的使用方法。
步骤:
1、定义一个实体类,作为ListView适配器的适配类型
class Color{
private String name;
private int imageId;
public Color(String name,int imageId){
this.name = name;
this.imageId = imageId;
}
public String getName(){
return name;
}
public int getImageId(){
return imageId;
}
}
2、在layout下创建目标item的xml文件,并设置布局。设置item中的imageView时注意imageView的大小及图片的缩放处理
3、创建一个继承自ArratAdapter的适配器(类),注意泛型指定的数据类型
class ColorAdapter extends ArrayAdapter{
private int resourceId;
public ColorAdapter(Context context, int resource, List objects) {//将上下文、ListView子项布局的id和数据传递进来
super(context, resource, objects);
resourceId = resource;//保存ListView子项布局的id
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {//此方法在每个子项被滚动到屏幕内的时候被调用
//return super.getView(position, convertView, parent);
//View view = LayoutInflater.from(getContext()).inflate(resourceId, null);//LayoutInflater来为这个子项加载我们传入的布局
Color color = getItem(position);//获取要显示在view上的数据
View view;
ViewHolder viewHolder;
if(convertView == null){//避免了每次都加载一遍布局,当ListView快速滚动的时候就会出现瓶颈,通过此改动
view = LayoutInflater.from(getContext()).inflate(resourceId, null);//起始创建屏幕显示个数的view,当顶部的view彻底滑出屏幕的时候,
/*初始化viewHolder*///滑出的view就进入到Recycler中准备进行复用,
viewHolder = new ViewHolder();//新滑进来的如果从Recycler中获取到了能复用的view,那么直接改写view中的数据即可
viewHolder.colorImage = (ImageView)view.findViewById(R.id.iv);
viewHolder.colorName = (TxetView)view.findViewById(R.id.tv);
view.setTag(viewHolder);//将viewHolder存储在view中
//如果Recycler中没有能重用的view,则创建新的(ListView中的一个子项)
}else{
view = convertView;
viewHolder = (ViewHolder)view.gettag();//重新获取ViewHolder
}
/*
ImageView colorImage = (ImageView)view.findViewById(R.id.iv);//分别获取item内控件的实例
TextView colorText = (TextView)view.findViewById(R.id.tv);
colorImage.setImageResource(color.getImageId());//分别调用set方法来设置控件内部显示的图片和文字
colorText.setText(color.getName());
*/
viewHolder.colorImage.setImageResource(color.getImageId());
viewHolder.colorName.setText(color.getNmae());
return view;//将设置完的布局返回
}
class ViewHolder{//定义类,用来保存findViewById返回的实例
ImageView colorImage;
TextView colorName;
}
}
4、创建一个ArrayList对象,用作数据和item之间的桥梁
private List colorlist = new ArrayList();
5、由于得初始化item中的数据,可以将ArrayList的初始化封装在一个初始化函数中,在加载完布局文件之后调用初始化即可
private void initColor(){
Color black = new Color("black",R.drawable.black);
colorlist.add(black);//把创建好的对象添加到colorlist中
Color pink = new Color("pink",R.drawable.pink);
colorlist.add(pink);
Color blue = new Color("blue",R.drawable.blue);
colorlist.add(blue);
Color red = new Color("red",R.drawable.red);
colorlist.add(red);
}
6、创建自定义适配器的对象,然后为ListView设置监听器即可
ColorAdapter adapter = new ColorAdapter(MainActivity.this, R.layout.color_item,colorlist);
7、为ListView设置监听器
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, colorList.get(position).getName(), Toast.LENGTH_SHORT).show();
}
});