0

我有两个活动,将 arraylist imageurls 从活动 Sdcard 传输到活动 AddProductActivity。Sdcard.java 代码是:

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

和活动 AddProductActivity 从活动 Sdcard 接收图像网址并在其上显示图像,如代码

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

但是当它返回活动 AddProductActivity 时,图像没有出现在 gridview 中,如果我单击 editorText 激活键盘,图像出现在 gridview 中。所以我很困惑,等待一些建议,谢谢!

图片网址: http: //i61.tinypic.com/2ch9onq.png 出现的活动键盘图片:http: //i61.tinypic.com/2l8uumc.png

如果我在 AddProductActivity 中使用了这个 getView() 方法,它工作正常。

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

但是当将 imageurls 转换回 AddProductActivity 时,它并不平滑。

4

2 回答 2

0

尝试替换适配器代码。

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

    }
于 2014-06-30T07:14:29.103 回答
0

我相信代码中缺少的是加载图像的调用(在侦听器的回调中)。notifyDataSetChanged() onLoadingComplete()

上面代码的写法,如果notifyDataSetChanged()被调用onLoadingComplete(),就可以解决你遇到的问题。

但是,notifyDataSetChanged()每次都在该回调方法中调用,可能会显着降低性能。您拥有的图像越多,性能下降的幅度就越大。

如果您确实通过执行上述操作观察到性能下降,为了解决它,我建议使用图像刷新辅助机制。这样您就可以调用notifyDataSetChanged()

  • 加载 n 张图像后
  • 或每 t 秒过去后

希望以上信息对您有所帮助。

于 2014-07-03T08:15:57.580 回答