2017-10-23 7 views
-1

GalleryActivity.javaというアクティビティがあり、GridViewAdapter.javaクラスを使用して、選択したフォルダのイメージをgridviewにロードします。このグリッドビュー上の画像をクリックすると、そのURLを取得して別のアクティビティに渡したいと思います。しかし、私はクリックされたイメージのURIを取得する方法を把握することはできません。ここでgridviewでクリックした画像のURIを取得するには?

はGalleryActivity.javaのコードです:

import android.Manifest; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.GridView; 
import android.widget.ImageButton; 
import android.widget.Toast; 

import java.util.ArrayList; 


public class GalleryActivity extends AppCompatActivity { 

    public static ArrayList<Model_images> al_images = new ArrayList<>(); 
    boolean boolean_folder; 
    Adapter_PhotosFolder obj_adapter; 
    GridView folder_gridview, gridView; 
    GridViewAdapter adapter; 
    ImageButton btnBack; 
    private int folder_gridview_slideout_position = 190; 
    private static final int REQUEST_PERMISSIONS = 100; 


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

     folder_gridview = (GridView)findViewById(R.id.gallery_gridview_folders); 
     gridView = (GridView)findViewById(R.id.gallery_gridview_photos); 


     // when gridview folder is clicked 
     folder_gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int int_position, long l) { 

       //load photos into gridview 
       adapter = new GridViewAdapter(getApplicationContext(),al_images,int_position); 
       gridView.setAdapter(adapter); 

      } 
     }); 

     // when a photo on gridView is clicked 
     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      // Here is the part where I want to get uri of image 
      } 
     }); 


     if ((ContextCompat.checkSelfPermission(getApplicationContext(), 
       Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(getApplicationContext(), 
       Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { 
      if ((ActivityCompat.shouldShowRequestPermissionRationale(GalleryActivity.this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE)) && (ActivityCompat.shouldShowRequestPermissionRationale(GalleryActivity.this, 
        Manifest.permission.READ_EXTERNAL_STORAGE))) { 

      } else { 
       ActivityCompat.requestPermissions(GalleryActivity.this, 
         new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 
         REQUEST_PERMISSIONS); 
      } 
     }else { 
      Log.e("Else","Else"); 
      fn_imagespath(); 
     } 

    } 


    // returns an array of images 
    public ArrayList<Model_images> fn_imagespath() { 
     al_images.clear(); 

     int int_position = 0; 
     Uri uri; 
     Cursor cursor; 
     int column_index_data, column_index_folder_name; 

     String absolutePathOfImage = null; 
     uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

     String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME}; 

     final String orderBy = MediaStore.Images.Media.DATE_TAKEN; 
     cursor = getApplicationContext().getContentResolver().query(uri, projection, null, null, orderBy + " DESC"); 

     column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); 
     column_index_folder_name = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 
     while (cursor.moveToNext()) { 
      absolutePathOfImage = cursor.getString(column_index_data); 
      Log.e("Column", absolutePathOfImage); 
      Log.e("Folder", cursor.getString(column_index_folder_name)); 

      for (int i = 0; i < al_images.size(); i++) { 
       if (al_images.get(i).getStr_folder().equals(cursor.getString(column_index_folder_name))) { 
        boolean_folder = true; 
        int_position = i; 
        break; 
       } else { 
        boolean_folder = false; 
       } 
      } 


      if (boolean_folder) { 

       ArrayList<String> al_path = new ArrayList<>(); 
       al_path.addAll(al_images.get(int_position).getAl_imagepath()); 
       al_path.add(absolutePathOfImage); 
       al_images.get(int_position).setAl_imagepath(al_path); 

      } else { 
       ArrayList<String> al_path = new ArrayList<>(); 
       al_path.add(absolutePathOfImage); 
       Model_images obj_model = new Model_images(); 
       obj_model.setStr_folder(cursor.getString(column_index_folder_name)); 
       obj_model.setAl_imagepath(al_path); 

       al_images.add(obj_model); 


      } 


     } 


     for (int i = 0; i < al_images.size(); i++) { 
      Log.e("FOLDER", al_images.get(i).getStr_folder()); 
      for (int j = 0; j < al_images.get(i).getAl_imagepath().size(); j++) { 
       Log.e("FILE", al_images.get(i).getAl_imagepath().get(j)); 
      } 
     } 
     obj_adapter = new Adapter_PhotosFolder(getApplicationContext(),al_images); 
     folder_gridview.setAdapter(obj_adapter); 
     return al_images; 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     switch (requestCode) { 
      case REQUEST_PERMISSIONS: { 
       for (int i = 0; i < grantResults.length; i++) { 
        if (grantResults.length > 0 && grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
         fn_imagespath(); 
        } else { 
         Toast.makeText(GalleryActivity.this, "The app was not allowed to read or write to your storage. Please consider granting it this permission", Toast.LENGTH_LONG).show(); 
        } 
       } 
      } 
     } 
    } 

} 

そしてここでは、ここでGridViewAdapter.java

import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.bumptech.glide.Glide; 
import com.bumptech.glide.load.engine.DiskCacheStrategy; 

import java.util.ArrayList; 


public class GridViewAdapter extends ArrayAdapter<Model_images> { 

    Context context; 
    ViewHolder viewHolder; 
    ArrayList<Model_images> al_menu = new ArrayList<>(); 
    int int_position; 


    public GridViewAdapter(Context context, ArrayList<Model_images> al_menu, int int_position) { 
     super(context, R.layout.adapter_photosfolder, al_menu); 
     this.al_menu = al_menu; 
     this.context = context; 
     this.int_position = int_position; 


    } 

    @Override 
    public int getCount() { 

     Log.e("ADAPTER LIST SIZE", al_menu.get(int_position).getAl_imagepath().size() + ""); 
     return al_menu.get(int_position).getAl_imagepath().size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    @Override 
    public int getViewTypeCount() { 
     if (al_menu.get(int_position).getAl_imagepath().size() > 0) { 
      return al_menu.get(int_position).getAl_imagepath().size(); 
     } else { 
      return 1; 
     } 
    } 

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


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 

      viewHolder = new ViewHolder(); 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.adapter_photosfolder, parent, false); 
      viewHolder.tv_foldern = (TextView) convertView.findViewById(R.id.tv_folder); 
      viewHolder.tv_foldersize = (TextView) convertView.findViewById(R.id.tv_folder2); 
      viewHolder.iv_image = (ImageView) convertView.findViewById(R.id.iv_image); 


      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.tv_foldern.setVisibility(View.GONE); 
     viewHolder.tv_foldersize.setVisibility(View.GONE); 



     Glide.with(context).load("file://" + al_menu.get(int_position).getAl_imagepath().get(position)) 
       .diskCacheStrategy(DiskCacheStrategy.NONE) 
       .skipMemoryCache(true) 
       .into(viewHolder.iv_image); 


     return convertView; 

    } 

    private static class ViewHolder { 
     TextView tv_foldern, tv_foldersize; 
     ImageView iv_image; 


    } 


} 

ためのコードであるModel_images.javaクラスが

public class Model_images { 
String str_folder; 
ArrayList<String> al_imagepath; 

public String getStr_folder() { 
    return str_folder; 
} 

public void setStr_folder(String str_folder) { 
    this.str_folder = str_folder; 
} 

public ArrayList<String> getAl_imagepath() { 
    return al_imagepath; 
} 

public void setAl_imagepath(ArrayList<String> al_imagepath) { 
    this.al_imagepath = al_imagepath; 
} 
} 

されますAdapter_PhotosFolder.javaクラスは次のとおりです。

import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.bumptech.glide.Glide; 
import com.bumptech.glide.load.engine.DiskCacheStrategy; 

import java.util.ArrayList; 


public class Adapter_PhotosFolder extends ArrayAdapter<Model_images> { 

    Context context; 
    ViewHolder viewHolder; 
    ArrayList<Model_images> al_menu = new ArrayList<>(); 


    public Adapter_PhotosFolder(Context context, ArrayList<Model_images> al_menu) { 
     super(context, R.layout.adapter_photosfolder, al_menu); 
     this.al_menu = al_menu; 
     this.context = context; 


    } 

    @Override 
    public int getCount() { 

     Log.e("ADAPTER LIST SIZE", al_menu.size() + ""); 
     return al_menu.size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    @Override 
    public int getViewTypeCount() { 
     if (al_menu.size() > 0) { 
      return al_menu.size(); 
     } else { 
      return 1; 
     } 
    } 

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


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 

      viewHolder = new ViewHolder(); 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.adapter_photosfolder, parent, false); 
      viewHolder.tv_foldern = (TextView) convertView.findViewById(R.id.tv_folder); 
      viewHolder.tv_foldersize = (TextView) convertView.findViewById(R.id.tv_folder2); 
      viewHolder.iv_image = (ImageView) convertView.findViewById(R.id.iv_image); 


      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.tv_foldern.setText(al_menu.get(position).getStr_folder()); 
     viewHolder.tv_foldersize.setText(al_menu.get(position).getAl_imagepath().size()+""); 



     Glide.with(context).load("file://" + al_menu.get(position).getAl_imagepath().get(0)) 
       .diskCacheStrategy(DiskCacheStrategy.NONE) 
       .skipMemoryCache(true) 
       .into(viewHolder.iv_image); 


     return convertView; 

    } 

    private static class ViewHolder { 
     TextView tv_foldern, tv_foldersize; 
     ImageView iv_image; 


    } 


} 
+0

のようになります。あなたの活動に

public YourActivity implements ImageClickListener 

アダプタをインタフェースを追加する方法

の下
public interface ImageClickListener{ void onClickImage(String url); } 

を使用して、ビューにタグとしてURIを設定することができますし、タグによって取得することができますonitemclick –

答えて

0
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int int_position, long l) { 
      Model_images modelImage = (Model_images) adapterView.getItemAtPosition(int_position); 
      Uri uri = modelImage.getAl_imagepath(); 
      //From here you can send uri to next activity } }); 
     } 

またはこの

+0

Arbaz Rizvi私はあなたの提案を試みたが、foll Uri uri = modelImage.getAl_imagepath()。get(l);私はこのエラーが発生します:ArrayListのget(int)は(long)に適用できません –

+0

"Model_images"クラスを共有できますか? –

+0

私は自分の投稿を編集して "Model_images"クラスを追加しました –

関連する問題