4

画像を含む ListView を使用しています。これらのイメージは、インターネットからアダプター内にロードされます。したがって、私はUniversalImageDownloaderを使用しています。

残念ながら、新しいコンテンツをダウンロードする必要がある場所を下にスクロールするとすぐに、ListView のスクロールが短時間「遅れ」ます。

ListView が完全にスムーズにスクロールするような動作を実際に期待していましたが、もちろん Image の読み込みにはさらに時間がかかる可能性があります。これはスクロールの滑らかさに影響を与えるべきではありません。

さらに、上にスクロールすると、ラグも発生します。画像が正しくキャッシュされていないようです。

ImageLoader オプションの設定が間違っているのではないでしょうか?

アダプターで何か間違ったことをしていますか?

ListView には、サイズが 640x320 (約 150kb) の約 20 ~ 30 個の画像が含まれています。

以下に、私のアダプターと ImageLoader を示します。(クラス Downloader は、UniversalImageDownloader の単なるラッパー クラスです)

public class Downloader {

    /**
     * initializes the imagedownloader with a specific configuration
     * I CALL THIS METHOD RIGHT AFTER APP STARTUP
     * @param c
     */
    public static void initialize(Context c) {

         // Create global configuration and initialize ImageLoader with this configuration

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(c)
        .threadPoolSize(20) 
        .threadPriority(Thread.NORM_PRIORITY) // default
        .tasksProcessingOrder(QueueProcessingType.FIFO) // default
        .memoryCacheSize(20 * 1024 * 1024)
        .memoryCacheSizePercentage(15) // default
        .discCacheSize(20 * 1024 * 1024)
        .discCacheFileCount(100)
        .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
        .imageDecoder(new BaseImageDecoder()) // default
        .build();

        ImageLoader.getInstance().init(config);
    }

    /**
     * gets the display options that are needed when displaying an image
     * @return
     */
    public static DisplayImageOptions getDisplayOptions() {

         DisplayImageOptions options = new DisplayImageOptions.Builder()
        .showImageForEmptyUri(R.drawable.error)
        .showImageOnFail(R.drawable.error)
        .resetViewBeforeLoading(false)  // default
        .cacheInMemory(true) // default
        .cacheOnDisc(true) // default
        .build();

        return options;
    }

    public static ImageLoader getInstance() {
        return ImageLoader.getInstance();
    }
}

そしてアダプター:

public class EventListAdapter extends ArrayAdapter<Event> {

    private List<Event> mList;
    private DisplayImageOptions options;

    public EventListAdapter(Context context, int list_item_resource, List<Event> objects) {
        super(context, list_item_resource, objects);
        mList = objects;

        options = Downloader.getDisplayOptions();
    }

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

        Event event = mList.get(position);

        // A ViewHolder keeps references to children views to avoid unneccessary calls to findViewById() on each row.
        ViewHolder holder = null;

        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.normalevent_list_item, parent, false);

            holder = new ViewHolder();;

            holder.eventimage = (ImageView) convertView.findViewById(R.id.ivEventImage);

            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();

        }

        if (event != null) {

            holder.eventimage.setImageResource(R.drawable.loading);
            // Load image, decode it to Bitmap and display Bitmap in ImageView
            Downloader.getInstance().displayImage(event.getImageOneURL(), holder.eventimage, options);
        }

        return convertView;
    }

    private static class ViewHolder {   

        ImageView eventimage;
    } 
}
4

2 に答える 2

1

@Sergey Pekar: あなたは私の命を救ってくれました! :)私は常に少数の画像に対してListViewにUILを使用していましたが、数が増えると、画像の最初のロード(スクロール中)で常にラグが発生しました。そのため、遅延も試してみましたが、他のUIL構成とオプションが少し役立ちましたが、満足できませんでした. 次に、さまざまな Image-Loading-Libraries (Picasso、AQuery、Volley、UrlImageViewHelper、カスタム コード) を試しました。それらはすべてUILよりも(最初のロードで)高速に動作しましたが、私には十分なオプションがありませんでした. そこで、このラグの問題に関する解決策を過去 2 日間探しました。神に感謝します。ついにあなたの投稿をここで見つけました。解決策は PauseOnScrollListener でした。

また、(PauseOnScrollListener に加えて) スクロールの滑らかさを少し改善するには、ImageView を拡張して requestLayout を次のように停止します。

public class CustomImageView extends ImageView
{
    public CustomImageView (Context context, AttributeSet attributeset, int int_style)
    {
        super(context, attributeset, int_style);
    }

    public CustomImageView (Context context, AttributeSet attributeset)
    {
        super(context, attributeset);
    }

    public CustomImageView (Context context)
    {
        super(context);
    }

    @Override
    public void requestLayout() 
    {
        // Do nothing here
    }
}

詳細については、この投稿を参照してください:
スクロール時に ListView が非常に遅い (ViewHolder/リサイクルを使用)

于 2014-03-29T21:09:37.647 に答える