簡體   English   中英

如何將圖庫中的圖像動態添加到我的 gridview? 我可以 go 到畫廊,但圖像沒有被添加到我的 gridview

[英]How can I add images from the gallery to my gridview dynamically ? I can go to the gallery but images aren't getting added to my gridview

MainActivity.java


因此,按鈕 choose_img_btn 會將您重定向到可以從中選擇圖像的圖庫,在我的 arraylist 中,我使用 R.drawable.ids 臨時添加了一些圖像。 到目前為止,我可以 go 到我的畫廊並單擊圖像,但圖像沒有被添加到我的 gridview 中。 我認為我在 onActivityResult Class 中犯了錯誤。 我需要一種方法將我的圖像從畫廊添加到我的 gridview,但不知道如何去做。 我嘗試了stackoverflow的許多結果,但它仍然無法正常工作。

公共 class 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, ie 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; 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(); }

}

圖像適配器 Class

公共 class 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, true);
    startActivityForResult(Intent.createChooser(intent, "Select Image"), select_image_code);
}

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

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

暫無
暫無

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

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