ListView的效率提高

来源:互联网 发布:淘宝店铺促销词不能用 编辑:程序博客网 时间:2024/05/05 20:22

public class people{
private String name;
private int image;
public people(String name,int image)
{
this.name=name;
this.image=image;
}
public String getName()
{
return name;
}
public int getImage()
{
return image;
}
}

public class PeopleAdapter extends ArrayAdapter{
private int itemId;
//将上下文,ListView的子布局,数据项传递进来
public PeopleAdapter(Context context,int textViewResourceId,List objects)
{
super(context,textViewResourceId,objects);
itemId=textViewResourceId;
}
public View getView(int position,View convertView,ViewGroup parent)
{
//获取当前子对象的实例
People people=getItem(position);
//通过LayoutInflater来为这个子项加载我们传入的布局。
View view=LayoutInflater.from(getContext()).inflate(itemId,null);
//通过view的findViewById()方法分别获取到TextView和ImageView的实例;
TextView textview=(TextView)view.findViewById(R.id.textview);
ImagView imageview=(ImagView)view.findViewById(R.id.imageview);
textview.setText(people.getName);
imageview.setImageResource(people.getImage);
return view;
}
}
//提升ListView的效率
//因为在PeopleAdapter中的getView()的方法每次都会将布局重新加载一遍,我们可以通过getView()中的convertView参数,用于将之前的加载好的布局进行缓存。
//修改代码如下:
public View getView(int position,View convertView,ViewGroup parent)
{
People people=getItem(position);
View view;
if(convertView==null)
{
view=LayoutInflater.from(getContext()).inflate(itemId,null);
}else{
view=convertView;
}
ImageView imageview=(ImageView)view.findViewById(R.id.imageview);
TextView textview=(TextView)view.findViewById(R.id.textview);
imageview.setImageResource(people.getImage());
textview.setText(people.getText());
return view;
}
//这时候程序不会再每次重新加载一次布局,但是依然会每次通过View的findViewByID()方法来获取控件的实例。应该借助一个ViewHolder进行优化。
//修改的代码如下:
public View getView(int position,View convertView,ViewGroup parent)
{
People people=getItem(position);
ViewHolder viewholder;
View view;
if(convertView==null)
{
view=LayoutInflater.from(getContext()).inflate(itemId,null);
viewholder=new ViewHolder();
viewholder.peopleImage=(ImageView)view.findViewById(R.id.imageview);
viewholder.peopleText=(TextView)view.findViewById(R.id.textview);
view.setTag(viewholder);//将viewholder保存在view中
}else{
view=convertView;
viewholder=(ViewHolder)view.getTag();
}
viewholder.peopleImage.setImageResource(people.getImage());
viewholder.peopleText.setText(people.getText());
return view;
}
class ViewHoder
{
ImageView peopleImage;
TextView peopleName;
}
//通过一个内部类ViewHolder用于对控件的实例进行缓存,当convertview为空的时候我们进行对布局的加载,并且通过ViewHolder对控件的实例进行缓存并且存储在通过View的setTag()方法进行保存,当convertView不为空的时候,我们通过getTag()方法将ViewHolder取出,这样所有控件的实例通保存在ViewHolder中了,每次都可以使用。

0 0
原创粉丝点击