前提代码
为什么要优化??因为有两个比较耗时间的地方
一个是获取控件:
另一个是inflater。
使用ViewHolder优化:
MyAdapter.java 代码改为:
package com.example.listview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
import java.util.Map;
public class MyAdapter extends BaseAdapter {
//数据集合list
List<Map<String,Object>> list;
//添加反射器
LayoutInflater inflater;
//构造器 上下文
public MyAdapter(Context context){
inflater=LayoutInflater.from(context);
}
//传入数据集合
public void setList( List<Map<String,Object>> list){
this.list=list;
}
@Override
public int getCount() {
return list.size();//lisview的长度,如果是null啥也不显示
}
@Override
public Object getItem(int position) {//没什么用
return list.get(position);
}
@Override
public long getItemId(int position) {//没什么用
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if(convertView==null){
convertView=inflater.inflate(R.layout.listview,null);
holder=new ViewHolder();
//填满holder,耗时间的操作放在此处
holder.logo=(ImageView)convertView.findViewById(R.id.iv_image);
holder.title=(TextView)convertView.findViewById(R.id.tv_title);
holder.context=(TextView)convertView.findViewById(R.id.tv_context);
convertView.setTag(holder);//setTag()存holder
}else{
//一个界面ListView显示有限,比如一页只能显示四个,那么从第五个开始
holder=(ViewHolder)convertView.getTag();//getTag()取出,(ViewHolder)强转类型
}
Map map=list.get(position);
//填充信息
holder.logo.setImageResource((Integer) map.get("image"));
holder.title.setText((String) map.get("text"));
holder.context.setText((String) map.get("context"));
//将含有信息的view返回到ListView
return convertView;
}
public class ViewHolder{
ImageView logo;
TextView title;
TextView context;
}
}