BaseAdapter的优化技巧和实战经验分享

分类:知识百科 日期: 点击:0

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;                

               
标签:

版权声明

1. 本站所有素材,仅限学习交流,仅展示部分内容,如需查看完整内容,请下载原文件。
2. 会员在本站下载的所有素材,只拥有使用权,著作权归原作者所有。
3. 所有素材,未经合法授权,请勿用于商业用途,会员不得以任何形式发布、传播、复制、转售该素材,否则一律封号处理。
4. 如果素材损害你的权益请联系客服QQ:77594475 处理。