0

i have two activites,transporting arraylist imageurls to activity AddProductActivity from activity Sdcard. The Sdcard.java code is:

    public class Sdcard extends Activity {

        private ArrayList<String> imageUrls;
        private DisplayImageOptions options;
        private ImageAdapter imageAdapter;
        ImageLoader imageLoader;

        @SuppressWarnings("deprecation")
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_photoalbum);

            getActionBar();
            getActionBar().setHomeButtonEnabled(true);
            getActionBar().setDisplayHomeAsUpEnabled(true);
            getActionBar().setDisplayShowTitleEnabled(true);
            getActionBar().setTitle("select image");

            final String[] columns = { MediaStore.Images.Media.DATA,
                    MediaStore.Images.Media._ID };
            final String orderBy = MediaStore.Images.Media.DATE_TAKEN;
            Cursor imagecursor = managedQuery(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
                    null, orderBy + " DESC");

            this.imageUrls = new ArrayList<String>();

            for (int i = 0; i < imagecursor.getCount(); i++) {
                imagecursor.moveToPosition(i);
                int dataColumnIndex = imagecursor
                        .getColumnIndex(MediaStore.Images.Media.DATA);
                imageUrls.add(imagecursor.getString(dataColumnIndex));

                System.out.println("=====> Array path => " + imageUrls.get(i));
            }

            options = new DisplayImageOptions.Builder()
                    .showImageForEmptyUri(R.drawable.ic_launcher)
                    .showImageOnFail(R.drawable.ic_error_loadingsmall)
                    .cacheInMemory(true)
                    .cacheOnDisk(true)
                    .considerExifParams(true)
                    .bitmapConfig(Bitmap.Config.RGB_565)
                    .build();

            imageLoader = ImageLoader.getInstance();
            imageLoader.init(ImageLoaderConfiguration.createDefault(this));

            imageAdapter = new ImageAdapter(this, imageUrls);

            GridView gridView = (GridView) findViewById(R.id.album_gridview);
            gridView.setAdapter(imageAdapter);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.select_image, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            switch (item.getItemId()) {
            case android.R.id.home:
                Intent intent = new Intent(Sdcard.this, AddProductActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
                return true;
            case R.id.select_image_submit:
                ArrayList<String> selectedItems = imageAdapter.getCheckedItems();
                if (selectedItems.size() == 0) {
                    Toast.makeText(getBaseContext(), "no selected image!", Toast.LENGTH_LONG)
                            .show();
                } else if (selectedItems.size() > 9) {
                    Toast.makeText(getBaseContext(), "must below 9 images", Toast.LENGTH_LONG)
                            .show();
                } else {
                    Intent intent1 = new Intent(this, AddProductActivity.class);
                    intent1.putStringArrayListExtra("select_image", selectedItems);
                    intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    setResult(9392,intent1);
                    finish();
                }
            default:
                return super.onOptionsItemSelected(item);
            }
        }

        @Override
        protected void onStop() {
            imageLoader.stop();
            super.onStop();
        }

        public class ImageAdapter extends BaseAdapter {

            ArrayList<String> mList;
            LayoutInflater mInflater;
            Context mContext;
            SparseBooleanArray mSparseBooleanArray;

            public ImageAdapter(Context context, ArrayList<String> imageList) {
                // TODO Auto-generated constructor stub
                mContext = context;
                mInflater = LayoutInflater.from(mContext);
                mSparseBooleanArray = new SparseBooleanArray();
                mList = new ArrayList<String>();
                this.mList = imageList;
            }

            public ArrayList<String> getCheckedItems() {
                ArrayList<String> mTempArry = new ArrayList<String>();

                for (int i = 0; i < mList.size(); i++) {
                    if (mSparseBooleanArray.get(i)) {
                        mTempArry.add(mList.get(i));
                    }
                }
                return mTempArry;
            }

            @Override
            public int getCount() {
                return imageUrls.size();
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public View getView(final int position, View convertView,
                    ViewGroup parent) {
                final ProgressBar spinner = (ProgressBar) findViewById(R.id.loading_image_fromsdcard);

                if (convertView == null) {
                    convertView = mInflater.inflate(
                            R.layout.photoalbum_gridview_item, null);
                }

                CheckBox mCheckBox = (CheckBox) convertView
                        .findViewById(R.id.select_image_cb);

                final ImageView imageView = (ImageView) convertView
                        .findViewById(R.id.photo_img_view);

                imageLoader.displayImage("file://" + imageUrls.get(position),
                        imageView, options, new SimpleImageLoadingListener() {
                            @Override
                            public void onLoadingStarted(String imageUri, View view) {
                                spinner.setVisibility(View.VISIBLE);
                            }

                            @Override
                            public void onLoadingFailed(String imageUri, View view,
                                    FailReason failReason) {
                                String message = null;
                                switch (failReason.getType()) {
                                case IO_ERROR:
                                    message = "Input/Output error";
                                    break;
                                case DECODING_ERROR:
                                    message = "Image can't be decoded";
                                    break;
                                case NETWORK_DENIED:
                                    message = "Downloads are denied";
                                    break;
                                case OUT_OF_MEMORY:
                                    message = "Out Of Memory error";
                                    break;
                                case UNKNOWN:
                                    message = "Unknown error";
                                    break;
                                }
                                Toast.makeText(Sdcard.this, message,
                                        Toast.LENGTH_SHORT).show();
                                spinner.setVisibility(View.GONE);
                            }

                            @Override
                            public void onLoadingComplete(String imageUri,
                                    View view, Bitmap loadedImage) {
                                spinner.setVisibility(View.GONE);
                                Animation anim =AnimationUtils.loadAnimation(Sdcard.this,
                                R.anim.push_left_in);
                                imageView.setAnimation(anim);
                                anim.start();
                                }
                        });

                imageView.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Toast.makeText(getBaseContext(),
                                "selected item is " + position, Toast.LENGTH_LONG)
                                .show();
                    }
                });

                mCheckBox.setTag(position);
                mCheckBox.setChecked(mSparseBooleanArray.get(position));
                mCheckBox.setOnCheckedChangeListener(mCheckedChangeListener);

                return convertView;
            }

            OnCheckedChangeListener mCheckedChangeListener = new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    // TODO Auto-generated method stub
                    mSparseBooleanArray.put((Integer) buttonView.getTag(),
                            isChecked);
                }
            };
        }
    }

and activity AddProductActivity recive imageurls from activity Sdcard and display image on it, like the code

    public class AddProductActivity extends Activity{

        GridView gridView;
        private String image;
        private static final int GALLERY_REQUEST = 9390;
        private DisplayImageOptions options;
        ImageLoader imageLoader;
        private ArrayList<String> selectImageUrls;
        String[] f;
        private SelectImageAdapter selectImageAdapter;
        ImageView imageView;

        @SuppressWarnings("deprecation")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add_product);

            final ActionBar actionBar = getActionBar();
            actionBar.setDisplayShowTitleEnabled(false);
            // actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
            actionBar.setHomeButtonEnabled(true);
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setDisplayShowTitleEnabled(true);
            actionBar.setTitle("add product");

            options = new DisplayImageOptions.Builder()
                    .showStubImage(R.drawable.ic_launcher)
                    .showImageOnFail(R.drawable.ic_error_loadingsmall)
                    .cacheInMemory().cacheOnDisc().build();

            gridView = (GridView) findViewById(R.id.select_image_gridview);
            this.selectImageUrls = new ArrayList<String>();

        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {

            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.add_product, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {       
            switch (item.getItemId()) {
            case android.R.id.home:
                Intent intent = new Intent(AddProductActivity.this,
                        MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
                return true;
            case R.id.action_upload_picture:
                return true;
            default:
                return super.onOptionsItemSelected(item);
            }
        }
        public void onSelectFromSD(MenuItem item) {

            Intent selectFromSdcard = new Intent(AddProductActivity.this,Sdcard.class);
            startActivityForResult(selectFromSdcard, GALLERY_REQUEST);

        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            System.out.println("[requestCode=" + requestCode + "]" + "[resultCode="
                    + resultCode + "]");

            if (requestCode == GALLERY_REQUEST && resultCode == 9392
                    && data != null) {

                // image = data.getData().toString();
                selectImageUrls = data.getStringArrayListExtra("select_image");             
                if (selectImageUrls != null) {
                    // System.out.println("recieve =" + selectImageUrls.size());
                    f = (String[]) selectImageUrls
                            .toArray(new String[selectImageUrls.size()]);
                    if (selectImageAdapter == null) {                       
                        selectImageAdapter = new SelectImageAdapter(this,
                                selectImageUrls);

                        imageLoader.init(ImageLoaderConfiguration
                                .createDefault(this));
                        gridView.setAdapter(selectImageAdapter);
                        selectImageAdapter.notifyDataSetChanged();
                        gridView.setOnItemClickListener(new OnItemClickListener() {

                            @Override
                            public void onItemClick(AdapterView<?> parent,
                                    View view, int position, long id) {

                                startFullImagePagerActivity(position);

                            }
                        });

                    } else {

                        selectImageAdapter.notifyDataSetChanged();
                    }

                } else {
                    return;
                }

            } else {
                super.onActivityResult(requestCode, resultCode, data);
            }
        }

        protected void startFullImagePagerActivity(int position) {
            // TODO Auto-generated method stub
            Intent i = new Intent(AddProductActivity.this,
                    FullScreenViewActivity.class);
            i.putStringArrayListExtra("position_url", selectImageUrls);
            i.putExtra("position", position);
            startActivity(i);
        }

        public class SelectImageAdapter extends BaseAdapter {

            LayoutInflater mInflater;
            Context mContext;

            public SelectImageAdapter(Context context, ArrayList<String> imageList) {
                // TODO Auto-generated constructor stub
                mContext = context;
                mInflater = LayoutInflater.from(mContext);
                imageLoader = ImageLoader.getInstance();
            }

            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return selectImageUrls.size();
            }

            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub

                return position;
            }    

            @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.select_image, null);
            }
            final ImageView imageView = (ImageView) convertView.findViewById(R.id.select_images);
            final ProgressBar spinner = (ProgressBar)convertView.findViewById(R.id.select_image_loading);

            //final ViewAnimator animator = (ViewAnimator)convertView.findViewById(R.id.animator);
            imageLoader.displayImage("file://" + selectImageUrls.get(position), imageView,
                    options, new SimpleImageLoadingListener() {
                        @Override
                        public void onLoadingStarted(String imageUri, View view) {
                            spinner.setVisibility(View.VISIBLE);
                            //animator.setDisplayedChild(1);
                        }

                        @Override
                        public void onLoadingFailed(String imageUri, View view,
                                FailReason failReason) {
                            String message = null;
                            switch (failReason.getType()) {
                            case IO_ERROR:
                                message = "Input/Output error";
                                break;
                            case DECODING_ERROR:
                                message = "Image can't be decoded";
                                break;
                            case NETWORK_DENIED:
                                message = "Downloads are denied";
                                break;
                            case OUT_OF_MEMORY:
                                message = "Out Of Memory error";
                                break;
                            case UNKNOWN:
                                message = "Unknown error";
                                break;
                            }Toast.makeText(AddProductActivity.this, message,Toast.LENGTH_SHORT).show();
                            spinner.setVisibility(View.GONE);
                            //animator.setDisplayedChild(0);
                        }

                        @Override
                        public void onLoadingComplete(String imageUri,
                                View view, Bitmap loadedImage) {
                            // Animation anim =
                            // AnimationUtils.loadAnimation(Sdcard.this,
                            // R.anim.push_left_in);
                            // imageView.setAnimation(anim);
                            // anim.start();
                            spinner.setVisibility(View.GONE);   
notifyDataSetChanged();//followed with Armin's suggestion
                    }
                    });
            return convertView;
        }
    }

but when it returned activity AddProductActivity,the images did not appear in gridview ,if i clicked the editorText to active the keyboard,the images appearing in the gridview. So i am puzzled,waiting for some suggestions, thanks!

image url :http://i61.tinypic.com/2ch9onq.png actived keyboard image appearing: http://i61.tinypic.com/2l8uumc.png

if i used this getView() method in AddProductActivity,it works fine.

@Override
         public View getView(final int position, View convertView, ViewGroup
         parent)
         {      
         if (convertView == null){
             imageView = new ImageView(mContext);
             imageView.setLayoutParams(new GridView.LayoutParams(245, 150));
             imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
         }
         else {
             imageView = (ImageView) convertView;
         }
                BitmapFactory.Options bmOptions = new BitmapFactory.Options();
                bmOptions.inJustDecodeBounds = false ;
                bmOptions.inSampleSize = 4;
                bmOptions.inPurgeable = true ;
                Bitmap bitmap = BitmapFactory.decodeFile(selectImageUrls.get(position), bmOptions);
                imageView.setImageBitmap(bitmap);

                return imageView;
         }

but it does not smooth when it transfored the imageurls back to AddProductActivity.

Giggle
  • 7
  • 5

2 Answers2

0

Try to replace adapter code.

  public class SelectImageAdapter extends BaseAdapter {

        Context mContext;
        ViewHolder holder;

        public SelectImageAdapter(Context context, ArrayList<String> imageList) {
            // TODO Auto-generated constructor stub
            mContext = context;
            imageLoader = ImageLoader.getInstance();
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return selectImageUrls.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub

            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = LayoutInflater.from(mContext).inflate(R.layout.select_image, null);
                holder.imageView =  (ImageView) convertView.findViewById(R.id.select_images);
                holder.spinner = (ProgressBar)convertView.findViewById(R.id.select_image_loading);
                convertView.setTag(holder);
            }else{
                holder = (ViewHolder) convertView.getTag();
            }

            //final ViewAnimator animator = (ViewAnimator)convertView.findViewById(R.id.animator);
            imageLoader.displayImage("file://" + selectImageUrls.get(position),holder.imageView,
                    options, new SimpleImageLoadingListener() {
                        @Override
                        public void onLoadingStarted(String imageUri, View view) {
                            holder.spinner.setVisibility(View.VISIBLE);
                            //animator.setDisplayedChild(1);
                        }

                        @Override
                        public void onLoadingFailed(String imageUri, View view,
                                                    FailReason failReason) {
                            String message = null;
                            switch (failReason.getType()) {
                                case IO_ERROR:
                                    message = "Input/Output error";
                                    break;
                                case DECODING_ERROR:
                                    message = "Image can't be decoded";
                                    break;
                                case NETWORK_DENIED:
                                    message = "Downloads are denied";
                                    break;
                                case OUT_OF_MEMORY:
                                    message = "Out Of Memory error";
                                    break;
                                case UNKNOWN:
                                    message = "Unknown error";
                                    break;
                            }
                            Toast.makeText(AddProductActivity.this, message,Toast.LENGTH_SHORT).show();
                            holder.spinner.setVisibility(View.GONE);
                            //animator.setDisplayedChild(0);
                        }

                        @Override
                        public void onLoadingComplete(String imageUri,
                                                      View view, Bitmap loadedImage) {
                            // Animation anim =
                            // AnimationUtils.loadAnimation(Sdcard.this,
                            // R.anim.push_left_in);
                            // imageView.setAnimation(anim);
                            // anim.start();
                            holder.spinner.setVisibility(View.GONE);
                        }
                    });

            return convertView;
        }

        class ViewHolder {
            ImageView imageView;
            ProgressBar spinner;
        }

    }
Haresh Chhelana
  • 24,720
  • 5
  • 57
  • 67
  • Thank you for your reply, Unfortunately it appeared after keyboard actived or gridview clicked which the gridview was setOnItemClickListener.i have found that if i lock the cellphone and then unlock it,the image could display – Giggle Jun 30 '14 at 08:48
0

I believe what is missing in the code is a call to notifyDataSetChanged() after the images are loaded (in onLoadingComplete() callback of the listener).

The way the above code is written, if notifyDataSetChanged() is called in onLoadingComplete(), it will solve the problem that you have.

However, calling notifyDataSetChanged() every time in that callback method, may degrade the performance significantly. The more images you have, the more the performance may drop.

If you do observe performance drop by doing the above, to solve it, I would suggest using an image refresh helper mechanism. This way you can either call notifyDataSetChanged():

  • after n images have been loaded
  • or after every t seconds has passed

I hope the information above helps you.

Armin
  • 1,807
  • 20
  • 21
  • Thanks for your reply, I followed your suggestion and added notifyDataSetChanged() method in onLoadingComplete() and have changed the code above in AddProductActivity.java,but the images did still not appear. – Giggle Jul 04 '14 at 01:50
  • Interesting... I have an alternate suggestion (not a solution to this specific problem) that you might find useful... Instead of using the `ImageLoader` (which I believe is from the `Android-Universal-Image-Loader`), try using `Picasso` (http://square.github.io/picasso/)... Would that help? – Armin Jul 04 '14 at 11:06