如何将图库中的图像动态添加到我的 gridview 中?我可以去画廊,但图像没有被添加到我的网格视图中

问题描述

MainActivity.java


所以按钮 choose_img_btn 会将您重定向到图库,您可以从中选择图像,在我的数组列表中,我使用 R.drawable.ids 临时添加了一些图像。到目前为止,我可以转到我的图库并单击图像,但图像没有添加到我的网格视图中。 我想我在 onActivityResult 类中犯了错误。我需要一种方法将我的图片从图库添加到我的 gridview,但不知道如何去做。我从 stackoverflow 中尝试了很多结果,但仍然无法正常工作。

公共类 MainActivity 扩展了 AppCompatActivity{
GridView gridView;
ImageButton choose_Img_Btn;
private static final int IMAGE_PICK_CODE = 1000;
private static final int PERMISSION_CODE = 1001;
public int queue=-1;
Uri selectedImage;
String imgDecodableString;



ArrayList<Integer> myImageIds = new ArrayList<>(Arrays.asList(

        R.drawable.img0,R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4,R.drawable.img5,R.drawable.img6,R.drawable.img7,R.drawable.img8,R.drawable.img9,R.drawable.img10,R.drawable.img11,R.drawable.img12,R.drawable.img13,R.drawable.img14,R.drawable.img15,R.drawable.img16,R.drawable.img41,R.drawable.img17,R.drawable.img18,R.drawable.img19,R.drawable.img20,R.drawable.img21,R.drawable.img22,R.drawable.img23,R.drawable.img24,R.drawable.img25,R.drawable.img26,R.drawable.img27,R.drawable.img28,R.drawable.img29,R.drawable.img43,R.drawable.img30,R.drawable.img31,R.drawable.img32,R.drawable.img33,R.drawable.img34,R.drawable.img35,R.drawable.img36,R.drawable.img37,R.drawable.img38,R.drawable.img39,R.drawable.img40,R.drawable.img42,R.drawable.img44,R.drawable.img45
));

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


    gridView = findViewById(R.id.myGrid);
    choose_Img_Btn = findViewById(R.id.choose_img_btn);

    // we need an adapter to set images in this grid-view
    gridView.setAdapter(new ImageAdaptor(myImageIds,this));


    gridView.setonItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView,View view,int i,long l) {
            int item_pos = myImageIds.get(i);

            ShowDialogBox(item_pos);
        }
    });

    choose_Img_Btn.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //check runtime permission
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED)
                {
                    //permission not granted,request it
                    String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
                    requestPermissions(permissions,PERMISSION_CODE);
                }
                else{
                    //permission already granted
                    pickImageFromgallery();
                }
            }
            else{
                //system OS is less then marshmallow xD
            }
        }
    });


}

private void pickImageFromgallery() {

    Intent intent  = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent,IMAGE_PICK_CODE);
}

//handle request for picked image


@Override
protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
    super.onActivityResult(requestCode,resultCode,data);
   /* if(resultCode == RESULT_OK && requestCode == IMAGE_PICK_CODE){
        gridView.
    }*/


    /*
    // Set up a try/catch for selecting images from the gallery.
    try {

        // If an image *is* selected,i.e. we make sure the user has actually selected one.
        if (requestCode == IMAGE_PICK_CODE && resultCode == RESULT_OK
                && data != null) {

            // Set
            queue = 1;

            //Assign the results of data.GetData() to our URI variable,selectedImage.
            //gridView = data.getData();

            // Set up a string to contain the name of the file in question.
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            // Get the cursor,Cursor cursor = getContentResolver().query(selectedImage,filePathColumn,null,null);

            // Move the cursor to the first row.
            cursor.movetoFirst();

            // ???? something to do with a database
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            imgDecodableString = cursor.getString(columnIndex);
            cursor.close();


        }

        // Stop the "You haven't picked an image!" message on displaying if we hit the back button
        // to return to the browse Photos screen from the Edit Photos screen.

        else if(queue!=-1) {

            return;
        }

        else {

            Toast.makeText(this,"You haven't picked an image!",Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        Toast.makeText(this,"Something went wrong!",Toast.LENGTH_LONG).show();
    }

    */



    if (requestCode == IMAGE_PICK_CODE && resultCode == RESULT_OK && data != null){
        Uri selectedImage = data.getData();
        choose_Img_Btn.setimageURI(selectedImage);
        //gridView.setAdapter(new ImageAdaptor(myImageIds,this));
        ImageView i = new ImageView(this);
        i.setimageURI(selectedImage);
        myImageIds.add(i.getId());

    }
}

//handle request for runtime permission
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
    switch (requestCode){
        case PERMISSION_CODE: {
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                //permission was granted
                pickImageFromgallery();
            }
            else{
                //permission was denied
                Toast.makeText(this,"Permission denied...!",Toast.LENGTH_SHORT).show();
            }
        }
    }
}

public void ShowDialogBox(int item_pos){
    Dialog dialog = new Dialog(this);

    dialog.setContentView(R.layout.custom_dialog);

    //Getting Custom Dialog Views
    TextView Image_name = dialog.findViewById(R.id.txt_Image_name);
    ImageView image  = dialog.findViewById(R.id.img);
    Button btn_full = dialog.findViewById(R.id.btn_full);
    Button btn_close = dialog.findViewById(R.id.btn_close);

    String title = getResources().getResourceName(item_pos);

    //Extract only name
    int index = title.indexOf("/");
    String name = title.substring(index+1,title.length());
    Image_name.setText(name);

    image.setimageResource(item_pos);

    btn_close.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            dialog.dismiss();
        }
    });

    btn_full.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this,FullView.class);
            intent.putExtra("img_id",item_pos);
            startActivity(intent);
        }
    });

    dialog.show();

}

}

ImageAdaptor 类

公共类 ImageAdaptor 扩展 BaseAdapter {

private List<Integer> mThumbIds;
private Context context;

public ImageAdaptor(List<Integer> mThumbIds,Context context) {
    this.mThumbIds = mThumbIds;
    this.context = context;
}


@Override
public int getCount() {
    return mThumbIds.size();
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return mThumbIds.get(i);
}

@Override
public View getView(int position,View convertView,ViewGroup parent) {
    ImageView imageView = (ImageView) convertView;

    if(imageView == null){
        imageView = new ImageView(context);
        imageView.setLayoutParams(new ViewGroup.LayoutParams(350,450));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    }

   // imageView.setimageResource(mThumbIds.get(position));

    Glide.with(context).load(mThumbIds.get(position)).into(imageView);

    return imageView;
}

解决方法

首先,要从图库中获取多张图片,您需要在创建打开图库的意图时添加 intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true);

    //select image
    public void Select_Image() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true);
    startActivityForResult(Intent.createChooser(intent,"Select Image"),select_image_code);
    }

之后,将所有选定的图像 URI 添加到 ArrayList<Uri> uriArrayList;

 @Override
 protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
    super.onActivityResult(requestCode,resultCode,data);
    if (requestCode == select_image_code && resultCode == RESULT_OK && data.getClipData() != null) {
        int image_count = data.getClipData().getItemCount();
        for (int i = 0; i < image_count; i++) {
            uriArrayList.add(data.getClipData().getItemAt(i).getUri());
        }
        gridview_adapter.notifyDataSetChanged();
    }
}

完整示例:

1) activity_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity2">

<Button
    android:id="@+id/BTN_select_image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="12dp"
    android:fontFamily="sans-serif"
    android:text="Select Image"
    android:textAllCaps="false"
    android:textSize="20dp" />

<GridView
    android:id="@+id/img_gridview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:numColumns="2"
    android:scrollbars="vertical" />
</LinearLayout>

2) gridview_adapter.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:orientation="vertical">

<ImageView
    android:id="@+id/Grid_imageview"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:src="@color/black" />
</LinearLayout>

3) MainActivity2.java

package com.demo.temp;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.GridView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;

public class MainActivity2 extends AppCompatActivity {

Button button;
GridView gridView;
private final int select_image_code = 0;
ArrayList<Uri> uriArrayList;
Gridview_Adapter gridview_adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    button = findViewById(R.id.BTN_select_image);
    gridView = findViewById(R.id.img_gridview);

    uriArrayList = new ArrayList<>();
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Select_Image();
        }
    });

    gridview_adapter = new Gridview_Adapter(uriArrayList);
    gridView.setAdapter(gridview_adapter);
}

//select image
public void Select_Image() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,select_image_code);
}

@Override
protected void onActivityResult(int requestCode,data);
    if (requestCode == select_image_code && resultCode == RESULT_OK && data.getClipData() != null) {
        int image_count = data.getClipData().getItemCount();
        for (int i = 0; i < image_count; i++) {
            uriArrayList.add(data.getClipData().getItemAt(i).getUri());
        }
        gridview_adapter.notifyDataSetChanged();
    }
}
}

4) Gridview_Adapter.java

package com.demo.temp;

import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import java.util.ArrayList;

public class Gridview_Adapter extends BaseAdapter {

ArrayList<Uri> uriArrayList;

public Gridview_Adapter(ArrayList<Uri> uriArrayList) {
    this.uriArrayList = uriArrayList;
}

@Override
public int getCount() {
    return uriArrayList.size();
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position,View convertView,ViewGroup parent) {
    if (convertView == null){
        convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.gridview_adapter,parent,false);

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

        imageView.setImageURI(uriArrayList.get(position));
    }
    return convertView;
}
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...