1

うまく動作していた画像ギャラリーアプリを作成しました。その後、一度に1つずつイメージを選択して削除できる機能を実装しようとしました。それはうまくいったが、同じフォルダイメージが任意のフォルダを開くと表示されるようになった。 例えば、フォルダ1,2,3を開くかどうかは関係ありません。フォルダの画像を表示します。。私はそれを修正するために最善を尽くしましたが、修正できませんでした。どのように修正するのですか?何か提案はありますか?毎回同じフォルダの位置が渡されます

ImageGallery.java

public class ImageGallery extends AppCompatActivity { 
    public static ArrayList<Model_images> al_images = new ArrayList<>(); 
    boolean boolean_folder; 
    Adapter_PhotosFolder obj_adapter; 
    GridView gv_folder; 
    private static final int REQUEST_PERMISSIONS = 100; 
    int int_position; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image_gallery); 
     gv_folder = (GridView) findViewById(android.R.id.list); 
     obj_adapter = new Adapter_PhotosFolder(this,al_images,int_position); 
     gv_folder.setAdapter(obj_adapter); 

     final ImageButton button1 = (ImageButton) findViewById(R.id.button1); 
     final ImageButton button2 = (ImageButton) findViewById(R.id.button2); 
     final ImageButton button3 = (ImageButton) findViewById(R.id.button3); 
     final ImageButton button4 = (ImageButton) findViewById(R.id.button4); 
     final ImageButton button5 = (ImageButton) findViewById(R.id.button5); 
     button1.setVisibility(View.GONE); 
     button2.setVisibility(View.GONE); 
     button3.setVisibility(View.GONE); 
     button4.setVisibility(View.GONE); 
     button5.setVisibility(View.GONE); 

     gv_folder.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Intent intent = new Intent(getApplicationContext(), PhotosActivity.class); 
       intent.putExtra("value",i); 
       startActivity(intent); 
      } 
     }); 

     gv_folder.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> adapterView, View view,final int i, long l) { 
       for (int j = 0; j < adapterView.getChildCount(); j++) 
        adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT); 

       // change the background color of the selected element 
       view.setBackgroundColor(Color.LTGRAY); 
       button1.setVisibility(View.VISIBLE); 
       button2.setVisibility(View.VISIBLE); 
       button3.setVisibility(View.VISIBLE); 
       button4.setVisibility(View.VISIBLE); 
       button5.setVisibility(View.VISIBLE); 
       button3.setOnClickListener(
         new View.OnClickListener() { 
          public void onClick(View view) { 
           AlertDialog.Builder builder1 = new AlertDialog.Builder(ImageGallery.this); 
           builder1.setMessage("Are you sure you want to delete it ?"); 
           builder1.setCancelable(true); 

           builder1.setPositiveButton(
             "Yes", 
             new DialogInterface.OnClickListener() { 
              public void onClick(DialogInterface dialog, int id) { 
               File file = new File(al_images.get(int_position).getAl_imagepath().get(i)); 
               file.delete(); 
               al_images.remove(i); 
               obj_adapter.notifyDataSetChanged(); 
               finish(); 
              } 
             }); 

           builder1.setNegativeButton(
             "No", 
             new DialogInterface.OnClickListener() { 
              public void onClick(DialogInterface dialog, int id) { 
               dialog.cancel(); 
              } 
             }); 

           AlertDialog alert11 = builder1.create(); 
           alert11.show(); 
          } 
         }); 

       return true; 
      } 
     }); 

     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(ImageGallery.this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE)) && (ActivityCompat.shouldShowRequestPermissionRationale(ImageGallery.this, 
        Manifest.permission.READ_EXTERNAL_STORAGE))) { 

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

    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; 
     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,int_position); 
     gv_folder.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(ImageGallery.this, "The app was not allowed to read or write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show(); 
        } 
       } 
      } 
     } 
    } 

} 

PhotosActivity.java:

public class PhotosActivity extends AppCompatActivity { 
    int int_position; 
    private GridView gridView; 
    GridViewAdapter adapter; 
    Adapter_PhotosFolder obj_adapter; 
    ArrayList<Model_images> al_menu = new ArrayList<>(); 
    boolean boolean_folder; 

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

     final ImageButton button1 = (ImageButton) findViewById(R.id.button1); 
     final ImageButton button2 = (ImageButton) findViewById(R.id.button2); 
     final ImageButton button3 = (ImageButton) findViewById(R.id.button3); 
     final ImageButton button4 = (ImageButton) findViewById(R.id.button4); 
     final ImageButton button5 = (ImageButton) findViewById(R.id.button5); 
     button1.setVisibility(View.GONE); 
     button2.setVisibility(View.GONE); 
     button3.setVisibility(View.GONE); 
     button4.setVisibility(View.GONE); 
     button5.setVisibility(View.GONE); 

     gridView = (GridView) findViewById(android.R.id.list); 
     int_position = getIntent().getIntExtra("value", 0); 
     adapter = new GridViewAdapter(this, al_images, int_position); 
     gridView.setAdapter(adapter); 
     fn_imagespath(); 

     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String abc = "file://" + al_images.get(int_position).getAl_imagepath().get(position); 

       Intent i = new Intent(getApplicationContext(), FullImageActivity.class); 
       i.putExtra("id", position); 
       i.putExtra("folderPosition", int_position); 
       i.putExtra("abc", abc); 
       startActivity(i); 
      } 
     }); 

     gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 
       for (int j = 0; j < parent.getChildCount(); j++) 
        parent.getChildAt(j).setBackgroundColor(Color.TRANSPARENT); 

       // change the background color of the selected element 
       view.setBackgroundColor(Color.LTGRAY); 
       button1.setVisibility(View.VISIBLE); 
       button2.setVisibility(View.VISIBLE); 
       button3.setVisibility(View.VISIBLE); 
       button4.setVisibility(View.VISIBLE); 
       button5.setVisibility(View.VISIBLE); 
       button3.setOnClickListener(
         new View.OnClickListener() { 
          public void onClick(View view) { 
           AlertDialog.Builder builder1 = new AlertDialog.Builder(PhotosActivity.this); 
           builder1.setMessage("Are you sure you want to delete it ?"); 
           builder1.setCancelable(true); 

           builder1.setPositiveButton(
             "Yes", 
             new DialogInterface.OnClickListener() { 
              public void onClick(DialogInterface dialog, int id) { 
               File file = new File(al_menu.get(int_position).getAl_imagepath().get(position)); 
               file.delete(); 
               MediaScannerConnection.scanFile(PhotosActivity.this,new String[] { file.toString() }, null, 
                 new MediaScannerConnection.OnScanCompletedListener() { 
                  public void onScanCompleted(String path, Uri uri) { 
                   Log.i("ExternalStorage", "Scanned " + path + ":"); 
                   Log.i("ExternalStorage", "-> uri=" + uri); 
                  } 
                 }); 
               al_menu.remove(position); 
               adapter.notifyDataSetChanged(); 
               finish(); 
              } 
             }); 

           builder1.setNegativeButton(
             "No", 
             new DialogInterface.OnClickListener() { 
              public void onClick(DialogInterface dialog, int id) { 
               dialog.cancel(); 
              } 
             }); 

           AlertDialog alert11 = builder1.create(); 
           alert11.show(); 
          } 
         }); 

       return true; 
      } 
     }); 
    } 
    public ArrayList<Model_images> fn_imagespath() { 
     al_menu.clear(); 

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

     String absolutePathOfImage; 
     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 = getApplication().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_menu.size(); i++) { 
       if (al_menu.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_menu.get(int_position).getAl_imagepath()); 
       al_path.add(absolutePathOfImage); 
       al_menu.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_menu.add(obj_model); 


      } 


     } 


     for (int i = 0; i < al_menu.size(); i++) { 
      Log.e("FOLDER", al_menu.get(i).getStr_folder()); 
      for (int j = 0; j < al_menu.get(i).getAl_imagepath().size(); j++) { 
       Log.e("FILE", al_menu.get(i).getAl_imagepath().get(j)); 
      } 
     } 
     adapter = new GridViewAdapter(this, al_menu,int_position); 
     gridView.setAdapter(adapter); 
     return al_menu; 
    } 
} 

Adapter_PhotosFolder.java:

public class Adapter_PhotosFolder extends ArrayAdapter<Model_images> { 

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


    public Adapter_PhotosFolder(Context context, ArrayList<Model_images> al_menu,int position) { 
     super(context, R.layout.activity_adapter__photos_folder, al_menu); 
     this.al_menu = al_menu; 
     this.context = context; 
     this.int_position=position; 
    } 

    @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.activity_adapter__photos_folder, 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; 


    } 
+1

'同じフォルダに画像を任意のfolder'を開くに表示されます。あなたはちょうど起こっていることをもっと詳しく説明できますか –

+0

たとえば、フォルダ1,2,3を開いても、フォルダ1内にある画像は常に表示されます。@VivekMishra –

答えて

1

をこれでループ全体を交換してください。 ImageGalleryアクティビティ内でこれを取得しています。これをもう一度繰り返す必要はありません。

また、すべてのフォルダをクリックした後に同じ画像が表示されます。これは、クリックフォルダ内の画像のリストではなく、フォルダのリストを渡すためです。

は、以下のコードで getCount()メソッドを置き換えます

@Override 
    public int getCount() { 
     Log.e("ADAPTER LIST SIZE", al_menu.size() + ""); 
     Log.e("ADAPTER LIST SIZE", al_menu.get(int_position).getAl_imagepath().size() + ""); 
     return al_menu.get(int_position).getAl_imagepath().size(); 
    } 
1

Glideにアダプタ...getAl_imagepath().get(0))の最初の位置にある画像のみを表示するように指示していますが、0を選択した項目の位置に置き換えてください。このように...

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

編集:私はコメントにこれを追加しているだろうが、その長すぎるので、私はできません。 fn_imagespath()関数では、ループの外側のループカウンタint_position =i;にアクセスしようとしています。あなたは、画像内であり、あなたにすべてのフォルダを取得し、PhotosActivityからfn_imagespath();行を削除してい...

for (int i = 0; i < al_menu.size(); i++) { 
       if (al_menu.get(i).getStr_folder().equals(cursor.getString(column_index_folder_name))) { 
        //boolean_folder = true; 

       ArrayList<String> al_path = new ArrayList<>(); 
       al_path.addAll(al_menu.get(i).getAl_imagepath()); 
       al_path.add(absolutePathOfImage); 
       al_menu.get(i).setAl_imagepath(al_path); 
        break; 
       } 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_menu.add(obj_model); 
       //adapter.notifyDatasetChanged(); 
       } 
      } 
+0

私はそれを試しましたが、仕事はありません。 "Whatsapp Images"という名前のフォルダ内にある画像を表示します。 –

+0

これは、 (MediaStore.Images.Media.DATA) ' – DevMike

+0

同じ結果、動作しません –

関連する問題