2

Je suis un débutant dans le développement d'applications Android et je suis ce tutoriel pour créer une galerie d'images. https://deepshikhapuri.wordpress.com/2017/03/20/get-all-images-from-gallery-in-android-programmatically/.
Cela fonctionne parfaitement, mais maintenant je veux afficher des images en ViewPager pour pouvoir afficher des images en balayant vers la gauche/droite. J'utilise un adaptateur pour le faire. J'ai essayé de le faire mais il ne fonctionne pas Je ne sais pas pourquoi. Je ne suis pas capable de glisser des images. Est-ce que quelqu'un peut m'aider ? Est-ce que j'utilise le bon chemin pour les images?ViewPager pour les images sur la carte SD ne fonctionne pas

Ce projet est disponible sur github ici:
https://github.com/avi003/MyApp0-master-master

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; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image_gallery); 
     gv_folder = (GridView)findViewById(R.id.gv_folder); 

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

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

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image_gallery); 
     gridView = (GridView)findViewById(R.id.gv_folder); 
     int_position = getIntent().getIntExtra("value", 0); 
     adapter = new GridViewAdapter(this, al_images,int_position); 
     gridView.setAdapter(adapter); 

     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("abc",abc); 
       startActivity(i); 
      } 
     }); 
    } 
} 

GridViewAdapter.java:

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

    } 
} 

Adapter_PhotosFolder.java:

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


    } 
} 

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

FullImageActivity.java:

public class FullImageActivity extends AppCompatActivity { 
    ImageView images; 
    int position; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_full_image); 
     Intent i = getIntent(); 
     images = (ImageView) findViewById(R.id.fullImage); 

     // Selected image id 
     position = i.getExtras().getInt("id"); 
     Bundle extras = getIntent().getExtras(); 
     String value = extras.getString("abc"); 

     Glide.with(FullImageActivity.this) 
       .load(value) 
       .skipMemoryCache(false) 
       .into(images); 

     ViewPager mViewPager = (ViewPager) findViewById(R.id.viewpager); 
     mViewPager.setAdapter(new TouchImageAdapter(this,al_images)); 
    } 
} 

activity_full_image.xml:

<?xml version="1.0" encoding="utf-8"?> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/jazzy_pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <ImageView 
      android:id="@+id/fullImage" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="center" 
      android:scaleType="centerCrop" 
     /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

TouchImageAdapter.java:

class TouchImageAdapter extends PagerAdapter { 
    Context context; 
    String filename; 
    ArrayList<Model_images> al_menu = new ArrayList<>(); 
    int position,int_position; 

    public TouchImageAdapter(Context context,ArrayList<Model_images> al_menu){ 
     this.al_menu = al_menu; 
     this.context = context; 
    } 

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

    @Override 
    public View instantiateItem(ViewGroup container, int position) { 
     ImageView img = new ImageView(container.getContext()); 
     img.setImageDrawable(getImageFromSdCard(filename,position)); 
     container.addView(img, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); 
     return img; 
    } 

    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((View) object); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == object; 
    } 


    public Drawable getImageFromSdCard(String imageName,int position) { 
     Drawable d = null; 
     try { 
      String path = al_menu.get(int_position).getAl_imagepath().get(position) 
        + "/"; 
      Bitmap bitmap = BitmapFactory.decodeFile(path + "/" + imageName 
        + ".jpeg"); 
      d = new BitmapDrawable(context.getResources(),bitmap); 
     } catch (IllegalArgumentException e) { 
      // TODO: handle exception 
     } 
     return d; 

    } 
} 
+0

avez-vous ** ** autorisation dans le fichier manifeste –

+0

oui, j'ai fait et les images sont affichées dans l'application, c'est juste que l'image suivante ne s'affiche pas sur le balayage @NileshRathod –

+0

Quelle est la taille de votre ** al_menu ** print taille dans ** LOG ** –

Répondre

1

Ici vous ne passent pas le nombre d'images dans ce dossier, donc à TouchImageAdapter vous passer le nombre de dossiers comme:

al_menu.size() // it always give you size of folder, 

al_menu.get(int_position).getAl_imagepath().size(); 

// passing the folder position so that correct folder images are to be shown. 
public TouchImageAdapter(Context context,ArrayList<Model_images> al_menu, int position){ 
     this.al_menu = al_menu; 
     this.context = context; 
     this.int_position = position; 
    } 

    @Override 
    public int getCount() { 
     return al_menu.get(int_position).getAl_imagepath().size(); 
    } 

Voici le code mis à jour je poussais sur https://github.com/redviper00/game

+0

Je ne comprends pas, ce code que vous avez fourni n'est pas différent du code de la question, est-ce? –

+0

Comme mentionné ci-dessus s'il vous plaît vérifier la valeur du chemin de fichier que vous passez à l'intérieur de setImageDrawable, Il est même. Vous devez passer un chemin d'accès différent. –

+0

J'ai essayé de passer un chemin de fichier différent, mais cela ne change rien –

0

essayer cette

String[] filenames = new String[0]; 
     File path = new File(Environment.getExternalStorageDirectory() + "/your folder"); 
     if (path.exists()) { 
      filenames = path.list(); 
     } 
     for (int i = 0; i < filenames.length; i++) { 
      imagesPathArrayList.add(path.getPath() + "/" + filenames[i]); 
      Log.e("FAV_Images", imagesPathArrayList.get(i)); 
      adapter = new ImageAdapter(FavActivity.this, imagesPathArrayList); 
      myviewpager.setAdapter(adapter); 

     } 

créer un classe Dapter comme celui-ci

public class ImageAdapter extends PagerAdapter { 

     Context context; 
     ArrayList<String> arrayList; 

     ImageAdapter(Context context, ArrayList<String> arrayList) { 
      this.context = context; 
      this.arrayList = arrayList; 
     } 

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

     @Override 
     public boolean isViewFromObject(View view, Object object) { 
      return view == ((ImageView) object); 
     } 

     @Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      viewPagerImageView = new ImageView(context); 



      viewPagerImageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 

      Bitmap bitmap = BitmapFactory.decodeFile(arrayList.get(position)); 
      viewPagerImageView.setImageBitmap(bitmap); 


      ((ViewPager) container).addView(viewPagerImageView, 0); 

      return viewPagerImageView; 

     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      ((ViewPager) container).removeView((ImageView) object); 
     } 
    } 
+0

effectivement mon application affiche des images dans différents dossiers, ou dossier-sage, s'il vous plaît voir la question mise à jour ci-dessus, c'est selon le tutoriel je suis –

0

Il semble que vous montrez Imageview ci-dessus vue téléavertisseur

images = (ImageView) findViewById(R.id.fullImage); 

qui est pourquoi, lorsque vous essayez de glisser gérer imageview votre action tocuh au lieu de pager vue. Retirez-le.

+0

Je suis capable de glisser, mais pourquoi même image s'affiche en plein écran encore et encore? –

+0

Je suis désolé, je suis complètement nouveau pour Android, vient de commencer il ya quelques mois –