文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>ListView性能[译]

ListView性能[译]

时间:2011-04-11  来源:xirihanlin

原文路径:http://blog.jteam.nl/2009/09/17/exploring-the-world-of-android-part-2/

·         ArrayAdapter<T> (显示数组对象,使用toString()来显示)

·         SimpleAdapter (显示Maps列表)

·         SimpleCursorAdapter(显示通过Cursor从DB中获取的信息)

public class ImageAndText {

    private String imageUrl;

    private String text;

 

    public ImageAndText(String imageUrl, String text) {

        this.imageUrl = imageUrl;

        this.text = text;

    }

    public String getImageUrl() {

        return imageUrl;

    }

    public String getText() {

        return text;

    }

}

public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> {

 

    public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts) {

        super(activity, 0, imageAndTexts);

    }

 

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        Activity activity = (Activity) getContext();

        LayoutInflater inflater = activity.getLayoutInflater();

 

        // Inflate the views from XML

        View rowView = inflater.inflate(R.layout.image_and_text_row, null);

        ImageAndText imageAndText = getItem(position);

 

        // Load the image and set it on the ImageView

        ImageView imageView = (ImageView) rowView.findViewById(R.id.image);

        imageView.setImageDrawable(loadImageFromUrl(imageAndText.getImageUrl()));

 

        // Set the text on the TextView

        TextView textView = (TextView) rowView.findViewById(R.id.text);

        textView.setText(imageAndText.getText());

 

        return rowView;

    }

 

    public static Drawable loadImageFromUrl(String url) {

        InputStream inputStream;

        try {

            inputStream = new URL(url).openStream();

        } catch (IOException e) {

            throw new RuntimeException(e);

        }

        return Drawable.createFromStream(inputStream, "src");

    }

}

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

              android:orientation="horizontal"

              android:layout_width="fill_parent"

              android:layout_height="wrap_content">

 

        <ImageView android:id="@+id/image"

                   android:layout_width="wrap_content"

                   android:layout_height="wrap_content"

                   android:src="@drawable/default_image"/>

 

        <TextView android:id="@+id/text"

                  android:layout_width="wrap_content"

                  android:layout_height="wrap_content"/>

 

</LinearLayout>

public class AsyncImageLoader {

    private HashMap<String, SoftReference<Drawable>> imageCache;

 

    public AsyncImageLoader() {

        imageCache = new HashMap<String, SoftReference<Drawable>>();

    }

 

    public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {

        if (imageCache.containsKey(imageUrl)) {

            SoftReference<Drawable> softReference = imageCache.get(imageUrl);

            Drawable drawable = softReference.get();

            if (drawable != null) {

                return drawable;

            }

        }

        final Handler handler = new Handler() {

            @Override

            public void handleMessage(Message message) {

                imageCallback.imageLoaded((Drawable) message.obj, imageUrl);

            }

        };

        new Thread() {

            @Override

            public void run() {

                Drawable drawable = loadImageFromUrl(imageUrl);

                imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));

                Message message = handler.obtainMessage(0, drawable);

                handler.sendMessage(message);

            }

        }.start();

        return null;

    }

 

    public static Drawable loadImageFromUrl(String url) {

        // ...

    }

 

    public interface ImageCallback {

        public void imageLoaded(Drawable imageDrawable, String imageUrl);

    }

}

·         调用loadDrawable(ImageUrl, imageCallback),传入一个匿名实现的ImageCallback接口

·         如果图片在缓存中不存在的话,图片将从单一的线程中下载并在下载结束时通过ImageCallback回调

·         如果图片确实存在于缓存中,就会马上返回,不会回调ImageCallback

ImageView imageView = (ImageView) rowView.findViewById(R.id.image);

imageView.setImageDrawable(loadImageFromUrl(imageAndText.getImageUrl()));

final ImageView imageView = (ImageView) rowView.findViewById(R.id.image);

Drawable cachedImage = asyncImageLoader.loadDrawable(imageAndText.getImageUrl(), new ImageCallback() {

    public void imageLoaded(Drawable imageDrawable, String imageUrl) {

        imageView.setImageDrawable(imageDrawable);

    }

});

imageView.setImageDrawable(cachedImage);

·         findViewById()的昂贵调用

·         每次都inflate XML

public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> {

 

    private ListView listView;

    private AsyncImageLoader asyncImageLoader;

 

    public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, ListView listView) {

        super(activity, 0, imageAndTexts);

        this.listView = listView;

        asyncImageLoader = new AsyncImageLoader();

    }

 

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        Activity activity = (Activity) getContext();

 

        // Inflate the views from XML

        View rowView = convertView;

        ViewCache viewCache;

        if (rowView == null) {

            LayoutInflater inflater = activity.getLayoutInflater();

            rowView = inflater.inflate(R.layout.image_and_text_row, null);

            viewCache = new ViewCache(rowView);

            rowView.setTag(viewCache);

        } else {

            viewCache = (ViewCache) rowView.getTag();

        }

        ImageAndText imageAndText = getItem(position);

 

        // Load the image and set it on the ImageView

        String imageUrl = imageAndText.getImageUrl();

        ImageView imageView = viewCache.getImageView();

        imageView.setTag(imageUrl);

        Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {

            public void imageLoaded(Drawable imageDrawable, String imageUrl) {

                ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl);

                if (imageViewByTag != null) {

                    imageViewByTag.setImageDrawable(imageDrawable);

                }

            }

        });

        imageView.setImageDrawable(cachedImage);

 

        // Set the text on the TextView

        TextView textView = viewCache.getTextView();

        textView.setText(imageAndText.getText());

 

        return rowView;

    }

}

public class ViewCache {

 

    private View baseView;

    private TextView textView;

    private ImageView imageView;

 

    public ViewCache(View baseView) {

        this.baseView = baseView;

    }

 

    public TextView getTextView() {

        if (textView == null) {

            textView = (TextView) baseView.findViewById(R.id.text);

        }

        return titleView;

    }

 

    public ImageView getImageView() {

        if (imageView == null) {

            imageView = (ImageView) baseView.findViewById(R.id.image);

        }

        return imageView;

    }

}

我已经向大家演示了3种改进ListView性能的方法:

·         在单一线程里加载图片

·         重用列表中行

·         缓存行中的View

 

 xirihanlin 2011.04.06

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载