如何在 Android 中使用 multiselectgridView 获取选定的文件路径?

How to get selected files path using multiselectgridView in Android?

我在我的应用程序中使用了 multiselectgridView,其中我将多个图像显示为网格项。如何在我的 gridview 中获取 selected 图像的路径。 我想在我的视图中添加一个按钮。因此,在单击该按钮后,我应该获得 selected 文件路径,如我在下面提供的图像中所示,这意味着我如何向我的应用程序添加类似照片 select 的 whatsapp 机制。

public class MainActivity extends Activity {

GridView mGrid;


private String[] arrPath;
private boolean[] thumbnailsselection;
private int ids[];
private int count;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);



    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;
    @SuppressWarnings("deprecation")
    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];
    this.thumbnailsselection = new boolean[this.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() {
   finish();
    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(MainActivity.this);
            i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            i.setLayoutParams(new ViewGroup.LayoutParams(50, 50));
            l = new CheckableLayout(MainActivity.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);
        }

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

    @SuppressWarnings("deprecation")
    public void setChecked(boolean checked) {
        mChecked = checked;
        setForeground(checked ? getResources().getDrawable(R.drawable.tr) : null);
        //setBackground(checked ? getResources().getDrawable(R.color.green) : null);
    }

    public boolean isChecked() {
        return mChecked;
    }

    public void toggle() {
        setChecked(!mChecked);
    }

}

public class MultiChoiceModeListener implements
        GridView.MultiChoiceModeListener {
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        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) {
        return true;
    }

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

    public void onItemCheckedStateChanged(ActionMode mode, int position,
            long id, boolean checked) {
        int selectCount = mGrid.getCheckedItemCount();
        switch (selectCount) {
        case 1:
            mode.setSubtitle("One item selected");
            break;
        default:
            mode.setSubtitle("" + selectCount + " items selected");
            break;
        }
    }

}
}

你走对了,你需要在操作栏上膨胀上下文操作模式菜单,看看 Android context menu

listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    // Respond to clicks on the actions in the CAB
    switch (item.getItemId()) {
        case R.id.menu_ok:
            //TODO do your stuff here
            mode.finish(); // Action picked, so close the CAB
            return true;
        default:
            return false;
    }
}

@Override
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;
}
});

在 onActionItemClicked() 方法中添加您的逻辑。

在菜单目录中添加context_menu.xml并添加菜单项

<item
  android:id="@+id/menu_ok"
  android:showAsAction="always"
  android:title="@string/action_ok"/>

就是这样!