Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中使用multiselectgrid选择图像数量_Java_Android_Android Gridview - Fatal编程技术网

Java 在Android中使用multiselectgrid选择图像数量

Java 在Android中使用multiselectgrid选择图像数量,java,android,android-gridview,Java,Android,Android Gridview,我设计了一个应用程序,其中我使用mulitiselectgridview进行图像选择。我的要求是我想限制用户选择最多8个图像,这意味着每当用户尝试检查第9个元素时,它都会显示一条警告消息作为弹出窗口,即最多可以选择8个图像,并且第9个图像应该自动取消选中 public class MultiImagePicActivity extends Activity { GridView mGrid; private String[] arrPath,modifiedArrayPath; priva

我设计了一个应用程序,其中我使用mulitiselectgridview进行图像选择。我的要求是我想限制用户选择最多8个图像,这意味着每当用户尝试检查第9个元素时,它都会显示一条警告消息作为弹出窗口,即最多可以选择8个图像,并且第9个图像应该自动取消选中

public class MultiImagePicActivity extends Activity {

GridView mGrid;


private String[] arrPath,modifiedArrayPath;
private int ids[];
private int count;
int selectCount;
Activity act=this;
List<String> imagepaths;
int maximageselection;
//int sel=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //now get Intent Extras




    imagepaths=new ArrayList<String>();
    imagepaths.clear();
    loadApps();

    setContentView(R.layout.grid_1);
    mGrid = (GridView) findViewById(R.id.myGrid);

    mGrid.setAdapter(new ImageAdapterxtends());

    mGrid.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
    mGrid.setMultiChoiceModeListener(new MultiChoiceModeListener());

}

    private void loadApps() {

    final String[] columns = { MediaStore.Images.Media.DATA,      MediaStore.Images.Media._ID };
    final String orderBy = MediaStore.Images.Media._ID;
    Cursor imagecursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy);
    int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID);
    this.count = imagecursor.getCount();
    this.arrPath = new String[this.count];
    ids = new int[count];
    for (int i = 0; i <this.count; i++) {
        imagecursor.moveToPosition(i);
        ids[i] = imagecursor.getInt(image_column_index);
        int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA);
        arrPath[i] = imagecursor.getString(dataColumnIndex);
    }

    imagecursor.close();

}
@Override
public void onBackPressed() {
    setResult(Activity.RESULT_CANCELED);
    super.onBackPressed();

}
public class ImageAdapterxtends extends BaseAdapter{
    CheckableLayout l;
    ImageView i;
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return arrPath.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return arrPath[position];
    }

    @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) {
            i = new ImageView(MultiImagePicActivity.this);
            i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            i.setLayoutParams(new ViewGroup.LayoutParams(50, 50));
            l = new CheckableLayout(MultiImagePicActivity.this);
            l.setLayoutParams(new GridView.LayoutParams(
                    GridView.LayoutParams.WRAP_CONTENT,
                    GridView.LayoutParams.WRAP_CONTENT));
            l.addView(i);
        } else {
            l = (CheckableLayout) convertView;
            i = (ImageView) l.getChildAt(0);
        }
//          Bitmap bmp =      Utility.getResizedBitmap(BitmapFactory.decodeFile(arrPath[position]), 50, 50);
//          i.setImageBitmap(bmp);
        try {
            setBitmap(i, ids[position]);
        } catch (Throwable e) {
        }
        return l;

    }


    }

    private void setBitmap(final ImageView iv,final int id) {

        new AsyncTask<Void, Void, Bitmap>() {
            Bitmap myBitmap;
            @Override
            protected Bitmap doInBackground(Void... params) {
                return MediaStore.Images.Thumbnails.getThumbnail(getApplicationContext().getContentResolver(), id, MediaStore.Images.Thumbnails.MICRO_KIND, null);
            }

            @Override
            protected void onPostExecute(Bitmap result) {
                super.onPostExecute(result);
                //iv.setImageBitmap(result);
                setMyBitmap(result);
            }
            public final void setMyBitmap(Bitmap bitmap) {

                  if (this.myBitmap != null) {
                    this.myBitmap.recycle();
                  }
                  this.myBitmap = bitmap;
                  iv.getLayoutParams().height = 100;
                  iv.getLayoutParams().width = 100;
                  iv.setImageBitmap(myBitmap);
                }
        }.execute();
    }





public class CheckableLayout extends FrameLayout implements Checkable {
    private boolean mChecked;

    public CheckableLayout(Context context) {
        super(context);
    }

    public void setChecked(boolean checked) {

        mChecked = checked;
        setForeground(checked ? getResources().getDrawable(R.drawable.tr) : null);
        }

    public boolean isChecked() {
        return mChecked;
    }

    public void toggle() {
        //sel--;
        selectCount--;
        setChecked(!mChecked);
    }

}

public class MultiChoiceModeListener implements
        GridView.MultiChoiceModeListener {
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate the menu for the CAB
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
        //return true;
        mode.setTitle("Select Items");
        mode.setSubtitle("One item selected");
        return true;
    }

    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return true;
    }

    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        // Respond to clicks on the actions in the CAB
        switch (item.getItemId()) {
            case R.id.menu_ok:
            Intent i = new Intent();
                modifiedArrayPath=imagepaths.toArray(new String[imagepaths.size()]);
                i.putExtra("selectedImagepath", modifiedArrayPath);
                //i.putExtra("data", selectedPath);
                setResult(Activity.RESULT_OK, i);
                //Toast.makeText(getApplicationContext(),String.valueOf(a),Toast.LENGTH_LONG).show();

                //TODO do your stuff here
                //mode.finish(); // Action picked, so close the CAB
                act.finish();
                return true;
            default:
                return false;
        }
    }

    public void onDestroyActionMode(ActionMode mode) {
        Toast.makeText(getApplicationContext(), "text", 1);
    }

    public void onItemCheckedStateChanged(ActionMode mode, int position,
            long id, boolean checked) {
        selectCount = mGrid.getCheckedItemCount();
        if(checked){
            imagepaths.add(arrPath[position]);
            if(selectCount>8){
                imagepaths.remove(arrPath[position]);
                new AlertDialog.Builder(MultiImagePicActivity.this)
                .setTitle("Restriction")
                .setMessage("Max 8 images are allowed!!!")
                .setPositiveButton(android.R.string.yes, new         DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { 
                        // continue with delete
                        //finish();
                        dialog.dismiss();
                    }
                 })
                .setIcon(android.R.drawable.ic_dialog_alert)
                 .show();

                selectCount=maximageselection;
            }
        switch (selectCount) {
        case 1:
            mode.setSubtitle("One item selected");
            break;
        default:
            mode.setSubtitle("" + selectCount + " items selected");
            break;
        }
        }
        else
            imagepaths.remove(arrPath[position]);
    }

}
}
公共类MultiImagePicActivity扩展活动{
GridView-mGrid;
私有字符串[]arrPath,modifiedArrayPath;
私有int-id[];
私人整数计数;
int-selectCount;
活动法案=此;
列出图像路径;
整数最大值选择;
//int sel=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//现在准备一些额外的东西
imagepath=newarraylist();
imagepath.clear();
loadApps();
setContentView(R.layout.grid_1);
mGrid=(GridView)findviewbyd(R.id.myGrid);
mGrid.setAdapter(新的ImageAdapterxtends());
mGrid.setChoiceMode(GridView.CHOICE\u MODE\u MULTIPLE\u MODE);
mGrid.setMultichoiceModelListener(新的MultichoiceModelListener());
}
私有void loadApps(){
最终字符串[]列={MediaStore.Images.Media.DATA,MediaStore.Images.Media.\u ID};
最终字符串orderBy=MediaStore.Images.Media.\u ID;
Cursor imagecursor=getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,columns,null,null,orderBy);
int image\u column\u index=imagecursor.getColumnIndex(MediaStore.Images.Media.ID);
this.count=imagecursor.getCount();
this.arrPath=新字符串[this.count];
ids=新整数[计数];
对于(int i=0;i 8){
移除(arrPath[position]);
新建AlertDialog.Builder(MultiImagePicActivity.this)
.setTitle(“限制”)
.setMessage(“最多允许8个图像!!!”)
.setPositiveButton(android.R.string.yes,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int其中){
//继续删除
//完成();
dialog.dismise();
}
})
.setIcon(android.R.drawable.ic_对话框_警报)
.show();
selectCount=最大值选择;
}
开关(选择计数){
案例1:
模式。设置子标题(“选定一项”);
打破
违约:
mode.setSubtitle(“+selectCount+”所选项目”);
打破
}
}
其他的
移除(arrPath[position]);
}
}
}

尝试维护一个计数变量,每当用户选择任何图像时,只需检查此计数,并根据计数执行一些操作。如果图像选择小于9,则更新计数。我知道..正如您所看到的,我在代码中也尝试了该逻辑。但在达到最大图像选择限制后,我无法取消选中图像。您能告诉我吗告诉我在哪里我必须修改我的代码