Search code examples
androidlistviewuniversal-image-loader

Universal Image Loader - listView was cleared


A few hours ago, I asked about AUIL call too many getView(). (Universal Image Loader - call too many getView())

By answers, I solve the problem that getView() was called too many times. However, I've still have a problem. When the activity was started, I can see the list. However, soon after, the list view was removed (or cleared). No images appear or load on the list view.

This is my source code.

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

Please help.


Solution

  • some times it create problem due to RoundedBitmapDisplayer just comment .displayer(new RoundedBitmapDisplayer(20)) this line and try to run again. If you want to use rounded image view then try library from below https://github.com/vinc3m1/RoundedImageView