Android-Universal-Image-Loader ::在GridView上加载图像

时间:2012-11-11 03:59:31

标签: android universal-image-loader

我正在尝试开发一个壁纸应用程序。应用程序启动时,活动会在gridView上显示类别(textView上的图像和相应名称)。当我选择一个类别时,它会导航到一个子类别。在子类别活动中,它还显示子类别图像及其在textVew上的相应名称。 问题在于子类活动图像未加载。有时会加载图像;当我按下后退按钮,然后再次选择该子类别时,它会加载三个模式图像;按下后退按钮并选择子类别会导致加载另外三个图像(现在共有10个图像)。 图像正确缓存在磁盘上。 这是我的配置:

   cacheDir = new File(Environment.getExternalStorageDirectory(),
                    "peakwallpapers/cache"); // --
            // Create configuration for ImageLoader
            config = new ImageLoaderConfiguration.Builder(this).enableLogging()
                    .discCache(new UnlimitedDiscCache(cacheDir))
                    .memoryCache(new UsingFreqLimitedMemoryCache(2000000))
                    .denyCacheImageMultipleSizesInMemory().threadPoolSize(10)
                    .threadPriority(Thread.MIN_PRIORITY + 2)
                    .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
                    .build(); // --

            options = new DisplayImageOptions.Builder()
                    .showStubImage(R.drawable.stub_image)
                    .showImageForEmptyUri(R.drawable.image_for_empty_url)
                    .cacheInMemory().cacheOnDisc().build();
            imageLoader.init(config);

这是getView()方法:

   @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final View rowView;
            final ViewHolder viewHolder = new ViewHolder();
            if (convertView == null) {
                rowView = getLayoutInflater().inflate(
                        R.layout.item_sub_category_grid, null);

                viewHolder.imageView = (ImageView) rowView
                        .findViewById(R.id.image_item_sub_category);
                viewHolder.textView = (TextView) rowView
                        .findViewById(R.id.text_item_sub_cat_desc);

                rowView.setTag(viewHolder);

            } else {
                rowView = (View) convertView;
            }

            ViewHolder holder = (ViewHolder) rowView.getTag();
            holder.textView.setText(wpSubCategories.get(position)
                    .getSubCategoryName());

            imageLoader.displayImage(imageUrls[position], viewHolder.imageView,
                    options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted() {
                    showLoading();
                }
                        @Override
                        public void onLoadingComplete(Bitmap loadedImage) {
                            Animation anim = AnimationUtils.loadAnimation(
                                    SubCategoryGridActivity.this,
                                    R.anim.fade_in);
                            viewHolder.imageView.setAnimation(anim);
                            anim.start();
                        }
                    });

            return rowView;
        }
    }

我的网格布局:sub_category_grid.xml:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview_sub_category"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:horizontalSpacing="4dip"
    android:numColumns="2"
    android:verticalSpacing="4dip" />

和我的网格项:item_sub_category_grid.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frame_l_item_sub_category_item"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight=".5"
    android:background="@drawable/textlines" >

    <ImageView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/image_item_sub_category"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:contentDescription="@string/descr_image"
        android:scaleType="centerCrop" />

    <TextView
        android:id="@+id/text_item_sub_cat_desc"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="@drawable/cat_bg"
        android:gravity="center_horizontal"
        android:text="TextView"
        android:textColorHighlight="#656565"
        android:typeface="monospace" >
    </TextView>

</FrameLayout>

N.B:它在LogCat上没有显示错误。

1 个答案:

答案 0 :(得分:4)

首先,我认为你的线程池大小太大了。当然,这取决于您的应用针对的设备。但是在非现代设备上它会很慢。我认为5就足够了,但你应该自己测试一下。改变线程池大小和线程优先级,以实现最佳速度和性能。

第二:你的getView()方法存在逻辑错误。移动 final ViewHolder viewHolder = new ViewHolder();  后 if (convertView == null) {  你会看到问题所在。您的变量viewHolderholder在逻辑上相互重叠。

UPD:如果你这样做,请不要在活动的onStop()中调用ImageLoader.stop()。