从gridview中删除项目

时间:2014-05-18 13:33:39

标签: android image gridview gallery delete-file

我知道如何删除项目有很多答案,但我无法使其发挥作用。它显示错误。你看看吗?我添加了适配器删除(位置),但我认为它错误地工作。 所以我想在使用onItemLongClickListener删除文件及其缩略图之后。

主:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final GridView grid = (GridView) findViewById(R.id.gridview);
    final ThumbnailAdapter thumbnails = new ThumbnailAdapter(this);
    grid.setAdapter(thumbnails);
    grid.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View v, int position,
                    long id) {

                final String imgPath = thumbnails.getImagePath(position);
                File file = new File(imgPath);                  
                 file.delete();
                 thumbnails.remove(position);
                 thumbnails.notifyDataSetChanged();
                 grid.invalidateViews();
                 grid.setAdapter(thumbnails);
                return true;


            }
    });

适配器:

public class ThumbnailAdapter extends BaseAdapter {

// Context required for performing queries
private final Context mContext;

// Cursor for thumbnails
private final Cursor cursor;
private final int imgId;
private final int imgData;
private final int count;

public ThumbnailAdapter(Context c) {
    this.mContext = c;

    // Get list of all images, sorted by last taken first
    final String[] projection = {
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATA
    };
    cursor = mContext.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            projection,
            null,
            null,
            MediaStore.Images.Media.DATE_TAKEN + " DESC"
    );
    imgId = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
    imgData = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    count = cursor.getCount();
    Log.d("ThumbnailAdapter", count + " images found");
}
@Override
public int getCount() {
    return count;
}
@Override
public Object getItem(int position) {
    return position;
}
@Override
public long getItemId(int position) {
    return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) {  // if it's not recycled, initialize some attributes
        imageView = new ImageView(mContext);
    } else {
        imageView = (ImageView) convertView;
    }
    cursor.moveToPosition(position);
    final Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail(
            mContext.getContentResolver(),
            cursor.getInt(imgId), 
            MediaStore.Images.Thumbnails.MICRO_KIND,
            null
    );
    imageView.setImageBitmap(thumbnail);
    Log.d("ThumbnailAdapter", "render: " + cursor.getString(imgData));
    return imageView;

}

public String getImagePath(int position) {
    cursor.moveToPosition(position);
    return cursor.getString(imgData);
}
public void remove(int position) {
    remove(position);
    notifyDataSetChanged();

}

}

2 个答案:

答案 0 :(得分:0)

我猜它的堆栈溢出。适配器中的remove方法是永久递归的。 而不是删除文件你自己要求内容解析器删除它。和重新加载数据。 你不必在点击列表器中再次调用grid.setAdapter(缩略图)

答案 1 :(得分:0)

请检查此行:

file.delete();
             thumbnails.remove(position);

您先删除文件,然后将其从适配器中删除。它应该是另一种方式。您重置您的适配器然后删除实际文件。您的缩略图在仍然连接到适配器时被删除。