簡體   English   中英

從圖庫中選擇多幅圖像並在圖像視圖中顯示每一個圖像

[英]Select multiple images from gallery and display every single one in a imageview

我的問題是如何從圖庫中選擇多張圖像並為每張照片動態添加ImageViews? 我嘗試了多種方法,但是我無法獲得適合我情況的方法。 由於我是新手,所以我不知道該怎么做。

我試過的

btn=(Button)findViewById(R.id.imageButton);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_IMAGE_MULTIPLE);
        }
    });

-

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    try {
        // When an Image is picked
        if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK
                && null != data) {
            // Get the Image from data

            String[] filePathColumn = { MediaStore.Images.Media.DATA };
            imagesEncodedList = new ArrayList<String>();
            if(data.getData()!=null){

                Uri mImageUri=data.getData();

                // Get the cursor
                Cursor cursor = getContentResolver().query(mImageUri,
                        filePathColumn, null, null, null);
                // Move to first row
                cursor.moveToFirst();

                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                imageEncoded  = cursor.getString(columnIndex);
                cursor.close();

            }else {
                if (data.getClipData() != null) {
                    ClipData mClipData = data.getClipData();
                    ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
                    for (int i = 0; i < mClipData.getItemCount(); i++) {

                        ClipData.Item item = mClipData.getItemAt(i);
                        Uri uri = item.getUri();
                        mArrayUri.add(uri);
                        // Get the cursor
                        Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
                        // Move to first row
                        cursor.moveToFirst();

                        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                        imageEncoded  = cursor.getString(columnIndex);
                        imagesEncodedList.add(imageEncoded);
                        cursor.close();

                    }
                    Log.v("LOG_TAG", "Selected Images" + mArrayUri.size());
                }
            }
        } else {
            Toast.makeText(this, "You haven't picked Image",
                    Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
                .show();
    }

    super.onActivityResult(requestCode, resultCode, data);
}

我有一個有效的圖像選擇器,但僅用於1張圖片:

我可以以某種方式更改它,以便它可以處理多個圖像並以編程方式添加ImageViews嗎?

private static int RESULT_LOAD_IMAGE = 1;


    btn=(Button)findViewById(R.id.imageButton);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(i, RESULT_LOAD_IMAGE);

                if (ContextCompat.checkSelfPermission(MainComp_News_Edit.this,
                        Manifest.permission.READ_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {

                    if (ActivityCompat.shouldShowRequestPermissionRationale(MainComp_News_Edit.this,
                            Manifest.permission.READ_EXTERNAL_STORAGE)) {

                    } else {

                        ActivityCompat.requestPermissions(MainComp_News_Edit.this,
                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
                    }
                }
            }
        });

-

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    try{
        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            picturePath = cursor.getString(columnIndex);
            cursor.close();

            ImageView imageView = (ImageView) findViewById(R.id.imageView);

            imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

翻譯:Selecteer een foto =選擇一張照片。 Verwijder Foto =刪除照片。

圖片選擇

當您獲得所選圖像的uri時調用該函數

在構建graddle文件中添加以下行

compile 'com.squareup.picasso:picasso:2.5.2'
 compile 'com.android.support:cardview-v7:23.1.1'

recyclerView_myc

<com.pacakage.AutofitRecyclerView
        android:id="@+id/recyclerView_myc"
        android:layout_marginTop="3dp"
        android:background="@color/AppBackGroundColor"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:layout_marginLeft="@dimen/activity_vertical_margin"
        android:layout_marginStart="@dimen/activity_vertical_margin"
        android:layout_marginRight="1dp"
        android:layout_marginEnd="1dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/view" />

PreviewMediaInGrid函數

private ArrayList<String> mArrayUri;  //uri of images you selected
  private void previewMediaInGrid(ArrayList<String> mArrayUri) {
            recyclerView= (AutofitRecyclerView) findViewById(R.id.recyclerView_myc); //recyclerView_myc will be autofitrecyelrview
            recyclerView.setVisibility(View.VISIBLE);
            vidPreview.setVisibility(View.GONE);
            imgPreview.setVisibility(View.GONE);
            mAdapter = new GridAdapterUpload(mArrayUri, getApplicationContext());
            recyclerView.setAdapter(mAdapter);

        }

GridAdapterUpload

public class GridAdapterUpload  extends RecyclerView.Adapter<GridAdapterUpload.ViewHolder> {
    private ArrayList<String> mItems;
    private  MyClickListener myClickListener;
    private Context mContext;
    private String TAG="GridAdapter";
    //private ProgressBar mProgressBar;

    public GridAdapterUpload(ArrayList<String> items,Context mContext) {
        this.mItems = items;
        this.mContext= mContext;

    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.galary_item, viewGroup, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
        viewHolder.mProgbar.setVisibility(View.VISIBLE);
        viewHolder.mProgbar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(mContext,
                R.color.colorButton), android.graphics.PorterDuff.Mode.MULTIPLY);

        Picasso.with(mContext)
                .load(new File(mItems.get(position)))
                .into(viewHolder.imgThumbnail, new com.squareup.picasso.Callback() {
                    @Override
                    public void onSuccess() {
                        viewHolder.mProgbar.setVisibility(View.INVISIBLE);
                    }
                    @Override
                    public void onError() {
                        viewHolder.mProgbar.setVisibility(View.INVISIBLE);
                    }
                });
        viewHolder.imgThumbnail.setScaleType(ImageView.ScaleType.CENTER_CROP);
    }
    @Override
    public int getItemCount() {
        return mItems.size();
    }
    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public ImageView imgThumbnail;
        public ProgressBar mProgbar;
        public ViewHolder(View itemView) {
            super(itemView);
            imgThumbnail = (ImageView)itemView.findViewById(R.id.img_thumbnail);
            mProgbar = (ProgressBar) itemView.findViewById(R.id.progressBar);
           // itemView.setOnClickListener(this);
        }
        public void onClick(View v) {
            myClickListener.onItemClick(getLayoutPosition(), v);
        }
    }
    public interface MyClickListener {
        void onItemClick(int position, View v);
    }
    public void setOnItemClickListener(MyClickListener myClickListener) {
        this.myClickListener = myClickListener;
    }


}

gallery_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:padding="2dp"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        card_view:cardCornerRadius="0dp"
        card_view:cardElevation="0.01dp">
        <RelativeLayout
            android:id="@+id/layout_root"
            android:layout_width="match_parent"
            android:background="@color/AppUploadCamreaPictureColor"
            android:layout_height="100dp">
            <ImageView
                android:id="@+id/img_thumbnail"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_centerHorizontal="true" />
            <ProgressBar
                android:id="@+id/progressBar"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:visibility="invisible"/>

        </RelativeLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

AutofitRecyclerView

public class AutofitRecyclerView extends RecyclerView {
  private GridLayoutManager manager;
  private int columnWidth = -1;

  public AutofitRecyclerView(Context context) {
    super(context);

    init(context, null);
  }

  public AutofitRecyclerView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
  }

  public AutofitRecyclerView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context, attrs);
  }

  private void init(Context context, AttributeSet attrs) {
    if (attrs != null) {
      int[] attrsArray = {
          android.R.attr.columnWidth
      };
      TypedArray array = context.obtainStyledAttributes(attrs, attrsArray);
      columnWidth = array.getDimensionPixelSize(0, -1);
      array.recycle();
    }

    manager = new GridLayoutManager(getContext(),3);
    setLayoutManager(manager);
  }

  @Override
  protected void onMeasure(int widthSpec, int heightSpec) {
    super.onMeasure(widthSpec, heightSpec);
    if (columnWidth > 0) {
      int spanCount = Math.max(1, getMeasuredWidth() / columnWidth);
      manager.setSpanCount(spanCount);
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM