使用ViewHolder对ListView进行优化,可以使ListView减少很多不必要的重复操作
自定义一个内部类,把adapter中的控件放在里面声明,初始化控件的时候判断convertView是否为空,若是为空的话则按照常规初
始化,然后在后面加上convertView.setTag(viewHolder); 当下一次执行时,若convertView不为空,则可以直接使用
viewHolder = (ViewHolder) convertView.getTag();来对控件进行初始化,这样可以省去很多的不必要操作,示例代码如下:
public class MenuItemAdapter extends BaseAdapter {
private List<Map<String, String>> data;
Context context;
public MenuItemAdapter(Context context, List<Map<String, String>> data) {
// TODO 自动生成的构造函数存根
this.context = context;
this.data = data;
}
@Override
public int getCount() {
// TODO 自动生成的方法存根
return data.size();
}
@Override
public Object getItem(int position) {
// TODO 自动生成的方法存根
return data.get(position);
}
@Override
public long getItemId(int position) {
// TODO 自动生成的方法存根
return position;
}
@SuppressLint("ViewHolder")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO 自动生成的方法存根
ViewHolder viewHolder = null;
if (null == convertView) {
convertView = LayoutInflater.from(context).inflate(
R.layout.adapter_menuitem, null);
viewHolder.menuitem_layout = (LinearLayout) convertView
.findViewById(R.id.menuitem_layout);
viewHolder.image_item = (ImageView) convertView
.findViewById(R.id.image_item);
viewHolder.dishes_item = (TextView) convertView
.findViewById(R.id.dishes_item);
viewHolder.price_item = (TextView) convertView
.findViewById(R.id.price_item);
viewHolder.order_btn = (Button) convertView
.findViewById(R.id.order_btn);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.dishes_item.setText(data.get(position).get("meal_name"));
viewHolder.price_item.setText("价格:" + data.get(position).get("price"));
if (position % 2 != 0) {
viewHolder.menuitem_layout.setBackgroundColor(Color
.parseColor("#2c2c2c"));
}
return convertView;
}
private static class ViewHolder { //使用ViewHolder优化ListView的性能,减少一些不必要的重复操作
ImageView image_item;
TextView dishes_item, price_item;
Button order_btn;
LinearLayout menuitem_layout;
}
}