2015-02-11 3 views
0

Я пытаюсь создать изображение ListView с помощью универсального загрузчика изображений. В настоящее время изображения не отображаются или не загружаются. Я обнаружил, что getView() от ImageAdapter был вызван во много раз.Универсальный загрузчик изображений - вызов слишком много getView()

Например, если размер списка равен 3, то getView() должен звонить 3 раза, но в моем коде звоните 24 раза !!!

Это мой исходный код.

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); 
       } 
      } 
     } 
    } 
} 

ArrayList<HashMap<String, Object >> feedList имеет 3 пунктов. Итак, getView() следует называть 3 раза, но вызывается 24 раза. Я думаю, что журнал должен быть таким,

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 

Но я получил журнал, как это:

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 
02-11 12:55:32.194: E/fashion(6829): getView, position : 0 
02-11 12:55:32.194: E/fashion(6829): getView, position : 1 
02-11 12:55:32.284: E/fashion(6829): getView, position : 2 
02-11 12:55:32.564: E/fashion(6829): getView, position : 0 
02-11 12:55:32.584: E/fashion(6829): getView, position : 1 
02-11 12:55:32.584: E/fashion(6829): getView, position : 2 
02-11 12:55:32.584: E/fashion(6829): getView, position : 0 
02-11 12:55:32.584: E/fashion(6829): getView, position : 1 
02-11 12:55:32.584: E/fashion(6829): getView, position : 2 
02-11 12:55:32.659: E/fashion(6829): getView, position : 0 
02-11 12:55:32.659: E/fashion(6829): getView, position : 1 
02-11 12:55:32.659: E/fashion(6829): getView, position : 2 
02-11 12:55:32.659: E/fashion(6829): getView, position : 0 
02-11 12:55:32.659: E/fashion(6829): getView, position : 1 
02-11 12:55:32.664: E/fashion(6829): getView, position : 2 
02-11 12:55:32.684: E/fashion(6829): getView, position : 0 
02-11 12:55:32.684: E/fashion(6829): getView, position : 1 
02-11 12:55:32.684: E/fashion(6829): getView, position : 2 
02-11 12:55:32.684: E/fashion(6829): getView, position : 0 
02-11 12:55:32.684: E/fashion(6829): getView, position : 1 
02-11 12:55:32.684: E/fashion(6829): getView, position : 2 
+0

см следующий пост [Как механизм рециркуляции ListView работает] (http://stackoverflow.com/questions/11945563/how-listviews-recycling-mechanism- работы/14108676 # 14108676) –

+0

@ ρяσѕρєяK Спасибо. Это очень полезно для меня. – addio3305

ответ

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> 
+0

Спасибо. Это работает для меня !!!! getView() вызывается только 3 раза. Тем не менее, список по-прежнему пуст .... :( – addio3305

Смежные вопросы