2015-02-11 17 views
0

几个小时前,我问AUIL调用了太多的getView()。 (Universal Image Loader - call too many getView()通用图像加载器 - listView被清除

通过回答,我解决了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){ 
        final ListView listView = (ListView)findViewById(R.id.list); 
        listView.setAdapter(new ImageAdapter()); 
        PauseOnScrollListener listener = new PauseOnScrollListener(ImageLoader.getInstance(), true, true); 
        listView.setOnScrollListener(listener); 
        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() { 
     super.onDestroy(); 
     if (registerTask != null) { 
      registerTask.cancel(true); 
     } 
     //GCMRegistrar.onDestroy(this); 
     AnimateFirstDisplayListener.displayedImages.clear(); 
    } 

    @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) { 
      View view = convertView; 
      if(convertView == null){ 
       view = inflater.inflate(R.layout.style_feed_list_view, parent, false); 
       view.setTag((ImageView)view.findViewById(R.id.style_feed_image)); 
      } 
      ImageLoader.getInstance().displayImage(feedList.get(position).get("URL").toString(), (ImageView)view.getTag(), 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); 
       } 
      } 
     } 
    } 
} 

请帮忙。

+0

尝试图书馆有时它因RoundedBitmapDisplayer创设问题只是评论.displayer(新RoundedBitmapDisplayer(20))这条线,并尝试再次运行 – andrewww 2015-02-11 07:12:36

+0

@andrewww谢谢! !!!!!!问题解决了!!!!! – addio3305 2015-02-11 07:23:34

+0

是因为RoundedBitmapDisplayer吗? – andrewww 2015-02-11 07:26:26

回答

0

由于RoundedBitmapDisplayer只是评论.displayer(新的RoundedBitmapDisplayer(20))这一行,并且尝试再次运行,有时它会产生问题。 如果你想使用四舍五入的图像视图,然后从下面 https://github.com/vinc3m1/RoundedImageView

相关问题