簡體   English   中英

通用圖像加載器 - listView已清除

[英]Universal Image Loader - listView was cleared

幾個小時前,我問過AUIL調用太多的getView()。 通用圖像加載器 - 調用太多getView()

通過答案,我解決了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);
                }
            }
        }
    }
}

請幫忙。

有時由於RoundedBitmapDisplayer會產生問題,只需在此行注釋.displayer(new RoundedBitmapDisplayer(20))並嘗試再次運行。 如果你想使用圓形圖像視圖然后嘗試從https://github.com/vinc3m1/RoundedImageView下面的庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM