2014-06-27 29 views
0

我有两个activites,将arraylist imageurls从活动Sdcard传送到活动AddProductActivity。该Sdcard.java代码:图像不出现在gridView中,但在键盘激活后

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 recive从活动SD卡imageurls和显示图像就可以了,像代码

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 actived键盘图像显示: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时并不平滑。

+0

waht是“mList”? –

+0

@Haresh使用mList保存所选图像 – Giggle

+0

您是否可以为网格中的每个项目定义单独的ProgressBar? –

回答

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

    } 
+0

谢谢你的回复,不幸的是,它出现在键盘活动或gridview点击后gridview setOnItemClickListener.i发现,如果我锁定手机然后解锁它,图像可能会显示 – Giggle

0

我相信在代码中缺少的是notifyDataSetChanged()后的图像加载通话(在onLoadingComplete()回调听者)。

上述代码写入的方式,如果notifyDataSetChanged()onLoadingComplete()中被调用,它会解决你的问题。

但是,每次在该回调方法中调用notifyDataSetChanged()时,可能会显着降低性能。你有更多的图像,性能可能会下降。

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

  • n张图像后已经被加载
  • 或每t秒之后已经经过了

我希望上面的信息可以帮助你。

+0

感谢您的回复,我遵循了您的建议,并在onLoadingComplete()中添加了notifyDataSetChanged()方法,并更改了AddProductActivity.java中的上述代码,但图像仍未出现。 – Giggle

+0

有趣的...我有一个替代的建议(不是解决这个特定的问题),你可能会发现有用...而不是使用'ImageLoader'(我相信是从'Android通用图像加载器' ),尝试使用'Picasso'(http://square.github.io/picasso/)...会有帮助吗? – Armin