2

Ich bin ein Neuling in Android App-Entwicklung und ich folge diesem Tutorial, um eine Bildergalerie zu erstellen. https://deepshikhapuri.wordpress.com/2017/03/20/get-all-images-from-gallery-in-android-programmatically/.
Es funktioniert perfekt, aber jetzt möchte ich Bilder in ViewPager für die Anzeige von Bildern durch Streichen nach links/rechts anzeigen.Ich verwende einen Adapter dafür. Ich habe versucht, es zu tun, aber es funktioniert nicht Ich weiß nicht warum. Ich bin nicht in der Lage, Bilder zu wischen. Kann mir jemand dabei helfen? Benutze ich den richtigen Pfad für die Bilder?ViewPager für Bilder auf SD-Karte funktioniert nicht

Dieses Projekt ist auf GitHub hier zur Verfügung:
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

hast du ** ** Berechtigung in der Manifest-Datei –

+0

Ja, ich tat und Bilder werden in der App angezeigt, nur das nächste Bild wird beim Wischen nicht angezeigt @NileshRathod –

+0

Wie groß ist Ihr ** al_menu ** Druck? Größe in ** LOG ** –

Antwort

1

Hier werden Sie nicht vorbei Anzahl der Bilder in diesem Ordner, also in TouchImageAdapter haben Sie die Anzahl der Ordner vorbei wie:

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

Hier wird der aktualisierte Code, den ich auf https://github.com/redviper00/game schob

+0

Ich verstehe es nicht, dieser Code, den Sie zur Verfügung gestellt ist nicht anders als der Code in der Frage, oder? –

+0

Wie oben erwähnt, überprüfen Sie bitte den Dateipfadwert, den Sie innerhalb von setImageDrawable übergeben. Sie müssen einen anderen Dateipfad übergeben. –

+0

Ich habe versucht, verschiedene Dateipfad übergeben, aber es ändert nichts –

0

versuchen diese

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

     } 

ein erstellen dapter Klasse wie folgt

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

tatsächlich meine App zeigt Bilder in verschiedenen Ordnern, oder Ordner-weise, sehen Sie bitte die aktualisierte Frage oben, es ist nach dem Tutorial ich bin gefolgt –

0

Es scheint, wie Sie Bildansicht über Ansicht Pager zeigen

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

Deshalb ist, wenn Sie versuchen, Ihre tocuh Aktion statt Ansicht Pager Swipe Imageview zu behandeln. Entfernen Sie es.

+0

Ich kann wischen, aber warum das gleiche Bild wird immer wieder auf dem Vollbild angezeigt? –

+0

Es tut mir leid, ich bin komplett neu bei Android, erst vor ein paar Monaten gestartet –

Verwandte Themen