BaseAdapter是Android中用于实现ListView和GridView的适配器,它可以让我们更方便的列表数据,但是由于它的实现方式,在大数据量的情况下,它会带来性能上的问题。优化BaseAdapter是Android开发中的必要工作。下面,我们将介绍BaseAdapter的优化技巧和实战经验。
使用ViewHolder
ViewHolder是一种优化ListView性能的有效方法,它可以减少findViewById的次数,从而提高ListView的性能。当ListView滑动时,会调用getView()方法,而getView()方法中的findViewById()会消耗大量的性能。使用ViewHolder可以缓存findViewById()的结果,从而提高ListView的性能。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.textView);
holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(data.get(position));
holder.imageView.setImageResource(R.drawable.ic_launcher);
return convertView;
}
static class ViewHolder {
TextView textView;
ImageView imageView;
}
以上代码中,我们使用了ViewHolder来缓存findViewById()的结果,从而提高了ListView的性能。
使用复用机制
当ListView滑动时,会调用getView()方法,而getView()方法中的inflate()会消耗大量的性能。使用复用机制可以缓存inflate()的结果,从而提高ListView的性能。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.textView);
holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(data.get(position));
holder.imageView.setImageResource(R.drawable.ic_launcher);
return convertView;
}
以上代码中,我们使用了复用机制来缓存inflate()的结果,从而提高了ListView的性能。
使用缓存技术
当ListView滑动时,会调用getView()方法,而getView()方法中的setImageResource()会消耗大量的性能。使用缓存技术可以缓存setImageResource()的结果,从而提高ListView的性能。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.textView);
holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(data.get(position));
if (bitmapCache.containsKey(position)) {
holder.imageView.setImageBitmap(bitmapCache.get(position));
} else {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
holder.imageView.setImageBitmap(bitmap);
bitmapCache.put(position, bitmap);
}
return convertView;
}
以上代码中,我们使用了缓存技术来缓存setImageResource()的结果,从而提高了ListView的性能。
避免在getView()方法中进行耗时操作
由于getView()方法会被频繁调用,在getView()方法中进行耗时操作会极大地影响ListView的性能。我们应该避免在getView()方法中进行耗时操作,而应该把耗时操作放到子线程中去处理。
使用异步加载技术
当ListView滑动时,会调用getView()方法,而getView()方法中的setImageResource()会消耗大量的性能。使用异步加载技术可以缓存setImageResource()的结果,从而提高ListView的性能。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;