0

下面是我从其他示例修改的代码。

现在我的流程是用户将选择多个图像,当单击选择按钮时,将弹出警报对话框询问“上传成功后删除照片”

所以当完成上传它会调用onActivityResult。

在 onActivityResult 中,我会

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {      
    case UPLOAD_IMAGES:
        if (resultCode == RESULT_OK){   
            imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);
            imagegrid.invalidateViews();    
            AndroidCustomGalleryActivity.this
            .runOnUiThread(new Runnable() {
                public void run() {
                    updateUI();
                }
            });
            System.out.println("Updated UI");           
        }
    }
}

但是我的 gridview 仍然无法刷新,删除的图像仍然显示。

完整的源代码在这里。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gallery);

    imageAdapter = new ImageAdapter();
    imageAdapter.initialize();
    imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);
    imagegrid.setAdapter(imageAdapter);

    AndroidCustomGalleryActivity.this
    .runOnUiThread(new Runnable() {
        public void run() {
            updateUI();
        }
    });

    final Button selectBtn = (Button) findViewById(R.id.selectBtn);
    selectBtn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            final int len = imageAdapter.images.size();
            int cnt = 0;
            String selectImages = "";
            for (int i = 0; i < len; i++) {
                if (imageAdapter.images.get(i).selection) {
                    cnt++;
                    selectImages = selectImages
                            + imageAdapter.images.get(i).id + ",";
                }
            }
            if (cnt == 0) {
                Toast.makeText(getApplicationContext(),
                        "Please select at least one image",
                        Toast.LENGTH_LONG).show();
            } else {

                 selectImages = selectImages.substring(0,selectImages.lastIndexOf(","));
                 AlertDialog.Builder helpBuilder = new AlertDialog.Builder(AndroidCustomGalleryActivity.this);
                 helpBuilder.setTitle("Photo upload");
                 helpBuilder.setMessage("Remove the photo once upload successful.");

                 UploadPhotoOnClickYes uploadPhotoOnClickYes = new UploadPhotoOnClickYes(AndroidCustomGalleryActivity.this, 
                         UploadQueue.class, selectImages);

                 UploadPhotoOnClickNo uploadPhotoOnClickNo = new UploadPhotoOnClickNo(AndroidCustomGalleryActivity.this, 
                         UploadQueue.class, selectImages);

                 helpBuilder.setPositiveButton("Yes",uploadPhotoOnClickYes);

                 helpBuilder.setNegativeButton("No", uploadPhotoOnClickNo);

                 // Remember, create doesn't show the dialog
                 AlertDialog helpDialog = helpBuilder.create();
                 helpDialog.show();
                }                                   
            }                       
    });     
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {      
    case UPLOAD_IMAGES:
        if (resultCode == RESULT_OK){   
            imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);
            imagegrid.invalidateViews();    
            AndroidCustomGalleryActivity.this
            .runOnUiThread(new Runnable() {
                public void run() {
                    updateUI();
                }
            });
            System.out.println("Updated UI");           
        }
    }
}

public void updateUI() {
    imageAdapter.checkForNewImages();
}

public class ImageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    public ArrayList<ImageItem> images = new ArrayList<ImageItem>();

    public ImageAdapter() {
        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void initialize() {
        images.clear();
        final String[] columns = { MediaStore.Images.Thumbnails._ID };
        final String orderBy = MediaStore.Images.Media._ID;                 

        Cursor imagecursor = managedQuery(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                columns,
                MediaStore.Images.Media.DATA + " like ? ", 
                new String[] {"%DVS%"},                 
                orderBy);
        if(imagecursor != null){
            int image_column_index = imagecursor
                    .getColumnIndex(MediaStore.Images.Media._ID);
            int count = imagecursor.getCount();
            for (int i = 0; i < count; i++) {
                imagecursor.moveToPosition(i);
                int id = imagecursor.getInt(image_column_index);
                ImageItem imageItem = new ImageItem();
                imageItem.id = id;
                lastId = id;
                imageItem.img = MediaStore.Images.Thumbnails.getThumbnail(
                        getApplicationContext().getContentResolver(), id,
                        MediaStore.Images.Thumbnails.MICRO_KIND, null);
                images.add(imageItem);
            }
            imagecursor.close();
        }
        notifyDataSetChanged();
    }

    public void checkForNewImages(){            
        images.clear(); //new
        //Here we'll only check for newer images
        final String[] columns = { MediaStore.Images.Thumbnails._ID };
        final String orderBy = MediaStore.Images.Media._ID;

        Cursor imagecursor = managedQuery(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                columns,
                MediaStore.Images.Media.DATA + " like ? ", 
                new String[] {"%DVS%"},             
                orderBy); //new

        int image_column_index = imagecursor
                .getColumnIndex(MediaStore.Images.Media._ID);
        int count = imagecursor.getCount();
        for (int i = 0; i < count; i++) {
            imagecursor.moveToPosition(i);
            int id = imagecursor.getInt(image_column_index);
            ImageItem imageItem = new ImageItem();
            imageItem.id = id;
            lastId = id;
            imageItem.img = MediaStore.Images.Thumbnails.getThumbnail(
                    getApplicationContext().getContentResolver(), id,
                    MediaStore.Images.Thumbnails.MICRO_KIND, null);             
            images.add(imageItem);
        }
        imagecursor.close();
        notifyDataSetChanged();
    }

    public int getCount() {
        return images.size();
    }

    public Object getItem(int position) {
        return position;
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.galleryitem, null);
            holder.imageview = (ImageView) convertView
                    .findViewById(R.id.thumbImage);
            holder.checkbox = (CheckBox) convertView
                    .findViewById(R.id.itemCheckBox);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        ImageItem item = images.get(position);
        holder.checkbox.setId(position);
        holder.imageview.setId(position);
        holder.checkbox.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {               
                CheckBox cb = (CheckBox) v;
                int id = cb.getId();
                if (images.get(id).selection) {
                    cb.setChecked(false);
                    images.get(id).selection = false;
                } else {
                    cb.setChecked(true);
                    images.get(id).selection = true;
                }
            }
        });
        holder.imageview.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {                   
                int id = v.getId();
                ImageItem item = images.get(id);
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                final String[] columns = { MediaStore.Images.Media.DATA };
                Cursor imagecursor = managedQuery(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns,
                        MediaStore.Images.Media._ID + " = " + item.id, null, MediaStore.Images.Media._ID);
                if (imagecursor != null && imagecursor.getCount() > 0){
                    imagecursor.moveToPosition(0);
                    String path = imagecursor.getString(imagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
                    File file = new File(path);
                    imagecursor.close();
                    intent.setDataAndType(
                            Uri.fromFile(file),
                            "image/*");
                    startActivityForResult(intent, VIEW_IMAGE);
                }
            }
        });
        holder.imageview.setImageBitmap(item.img);
        holder.checkbox.setChecked(item.selection);
        return convertView;
    }
}

class ViewHolder {
    ImageView imageview;
    CheckBox checkbox;
}

class ImageItem {
    boolean selection;
    int id;
    Bitmap img;
}
4

2 回答 2

1

我现在无法尝试您的代码,但试试这个:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {      
    case UPLOAD_IMAGES:
        if (resultCode == RESULT_OK){   
            imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);
            AndroidCustomGalleryActivity.this
            .runOnUiThread(new Runnable() {
                public void run() {
                    updateUI();
                    imageAdapter.notifyDataSetChanged();
                }
            });
            System.out.println("Updated UI");           
        }
    }
}

删除元素后,我只是移动了 gridview 的失效。

于 2012-12-18T09:25:42.720 回答
0

我自己找到了答案,这是因为我使用 file.delete 删除了图像。所以它只删除物理文件,但删除的图像仍然缓存。

所以需要用这个方法来删除文件。

Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Uri itemUri = ContentUris.withAppendedId(contentUri, item.media_id);
getContentResolver().delete(itemUri, null, null);
于 2012-12-19T10:09:16.650 回答