画像を含む 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;
}
}