图像没有出现在gridView中,但在键盘激活后



我有两个活动,将数组列表图像从活动sd卡传输到活动AddProductActivity。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从活动sd卡接收图像并在其上显示图像,如代码

    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中。所以我很困惑,等待一些建议,谢谢!

image url: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;
         }

但是当它将图像转换回AddProductActivity时,它不平滑

尝试替换适配器代码

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

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

以上代码的编写方式,如果在onLoadingComplete()中调用notifyDataSetChanged(),它将解决您的问题。

但是,在该回调方法中每次调用notifyDataSetChanged()可能会显著降低性能。图片越多,性能越差。

如果通过上述操作观察到性能下降,我建议使用图像刷新辅助机制来解决这个问题。这样你可以调用notifyDataSetChanged():

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

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

最新更新