第一步:使用convertView.(减少内存中view对象创建的个数)
convertView的定义:The old view to reuse,使用它首先得判断他是否为空。
第一屏的时候convertView为null,view有其自身的值,那么滚动到第二屏的时候,convertView在第二屏的第一个值会使用view在第一屏的第一个值。
View view;
if (convertView == null) {
view = View.inflate(context, R.layout.list_item_callsms, null);
}else {
view = convertView;
}
第二步:(减少子孩子查询的次数)使用ViewHolder
Hold View Objects in a View Holder
Your code might call findViewById()
frequently during the scrolling of ListView
, which can slow down performance. Even when the Adapter
returns an inflated view for recycling, you still need to look up the elements and update them. A way around repeated use of findViewById()
is to use the "view holder" design pattern.
A ViewHolder
object stores each of the component views inside the tag field of the Layout, so you can immediately access them without the need to look them up repeatedly. First, you need to create a class to hold your exact set of views. For example:
static class ViewHolder { TextView text; TextView timestamp; ImageView icon; ProgressBar progress; int position; }
Then populate the ViewHolder
and store it inside the layout.
ViewHolder holder = new ViewHolder(); holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image); holder.text = (TextView) convertView.findViewById(R.id.listitem_text); holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp); holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner); convertView.setTag(holder);
Now you can easily access each view without the need for the look-up, saving valuable processor cycles.
我们的代码:package com.ustc.mobilemanager.adapter;
import java.util.List;
import com.ustc.mobilemanager.R;
import com.ustc.mobilemanager.db.BlackNumberDao;
import com.ustc.mobilemanager.domain.BlackNumberInfo;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class CallSmsSafeAdapter extends BaseAdapter {
private List<BlackNumberInfo> infos;
private BlackNumberDao dao;
private Context context;
public CallSmsSafeAdapter(Context context) {
this.context = context;
dao = new BlackNumberDao(context);
infos = dao.findAll();
}
@Override
public int getCount() {
return infos.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = View.inflate(context, R.layout.list_item_callsms, null);
viewHolder = new ViewHolder();
viewHolder.tv_black_number = (TextView) view
.findViewById(R.id.tv_black_number);
viewHolder.tv_black_mode = (TextView) view
.findViewById(R.id.tv_black_mode);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.tv_black_number.setText(infos.get(position).getNumber());
String mode = infos.get(position).getMode();
if ("1".equals(mode)) {
viewHolder.tv_black_mode.setText("电话拦截");
} else if ("2".equals(mode)) {
viewHolder.tv_black_mode.setText("短信拦截");
} else {
viewHolder.tv_black_mode.setText("全部拦截");
}
return view;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
static class ViewHolder {
TextView tv_black_number;
TextView tv_black_mode;
}
}
ViewHoler加上static,使其成为静态类,字节码只会加载进来一次。