[英]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.