通用图像加载器 - 调用太多getView()

时间:2015-02-11 04:12:06

标签: android adapter universal-image-loader getview

我尝试使用universal-image-loader创建图像ListView。目前,没有图像出现或加载。我发现来自getView()的{​​{1}}被多次调用。

例如,如果列表大小为3,那么ImageAdapter应该调用3次,但在我的代码中,调用24次!!!

这是我的源代码。

getView()

public class MainActivity extends Activity{ AsyncTask<Void, Void, Void> asyncTask, registerTask; DisplayImageOptions options; ArrayList<HashMap<String, Object>> feedList = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int cacheSize = ((ActivityManager)getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass() * 1024 * 1024 / 8; ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this) .memoryCacheExtraOptions(metrics.widthPixels, metrics.heightPixels) .diskCacheExtraOptions(metrics.widthPixels, metrics.heightPixels, null) .memoryCache(new LruMemoryCache(cacheSize)) .memoryCacheSize(cacheSize) .memoryCacheSizePercentage(13) .diskCache(new UnlimitedDiscCache(StorageUtils.getCacheDirectory(this))) .diskCacheSize(100 * 1024 * 1024) .diskCacheFileCount(200) .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) .imageDownloader(new BaseImageDownloader(this)) .imageDecoder(new BaseImageDecoder(false)) .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) .build(); ImageLoader.getInstance().init(config); options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_stub) .showImageForEmptyUri(R.drawable.ic_empty) .showImageOnFail(R.drawable.ic_error) .cacheInMemory(true) .cacheOnDisk(true) .considerExifParams(true) .displayer(new RoundedBitmapDisplayer(20)) .build(); asyncTask = new AsyncTask<Void, Void, Void>() { protected Void doInBackground(Void... params) { StyleFeedServerUtils serverUtils = new StyleFeedServerUtils(); feedList = serverUtils.getStyleFeedList(MainActivity.this); return null; } @Override protected void onPostExecute(Void result) { if(feedList != null && feedList.size() > 0){ ListView listView = (ListView)findViewById(R.id.list); listView.setAdapter(new ImageAdapter()); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.e("fashion", "onItemClick, position : "+position); } }); } asyncTask.cancel(!isCancelled()); asyncTask = null; } }; asyncTask.execute(null, null, null); } @Override public void onDestroy() { if (registerTask != null) { registerTask.cancel(true); } GCMRegistrar.onDestroy(this); AnimateFirstDisplayListener.displayedImages.clear(); super.onDestroy(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } class ImageAdapter extends BaseAdapter { private LayoutInflater inflater; private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener(); ImageAdapter() { inflater = LayoutInflater.from(MainActivity.this); } @Override public int getCount() { return feedList.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { Log.e("fashion", "getView, position : "+position); View view = convertView; if (convertView == null) { view = inflater.inflate(R.layout.style_feed_list_view, parent, false); } ImageView imageView = (ImageView)view.findViewById(R.id.style_feed_image); ImageLoader.getInstance().displayImage(feedList.get(position).get("URL").toString(), imageView, options, animateFirstListener); return view; } } private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener { static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>()); @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (loadedImage != null) { ImageView imageView = (ImageView) view; boolean firstDisplay = !displayedImages.contains(imageUri); if (firstDisplay) { FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri); } } } } } feedList有3个项目。因此,ArrayList<HashMap<String, Object >>应该被调用3次,但被调用24次。 我认为日志应该是这样的,

getView()

但是,我得到了这样的日志:

02-11 12:55:32.059: E/fashion(6829): getView, position : 0
02-11 12:55:32.084: E/fashion(6829): getView, position : 1
02-11 12:55:32.184: E/fashion(6829): getView, position : 2

1 个答案:

答案 0 :(得分:1)

getview()调用与使用AIUL无关。

我建议您这样喜欢这个。

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ListView
        android:id="@+id/list_listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>
</LinearLayout>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView
        android:id="@+id/list_listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>
</LinearLayout>