2017-09-28 2 views
2

J'ai une grille d'images qui ont été prises à partir d'une activité caméra personnalisée. Sur une autre activité, je charge les images dans une grille. J'ai une méthode qui allume & d'une case à cocher sur chaque image. En essayant de parcourir toutes les images, j'obtiens un comportement étrange: GridView.getCount() renvoie le nombre correct d'images dans GridView, mais la méthode GridView.getChildAt() n'a renvoyé qu'une partie des images. alors, quand j'essaye de le faire, j'obtiens une exception nulle.GridView getChildAt retourne null pour les enfants visibles

L'adaptateur GridView:

public class PhotoGalleryAdapter extends ArrayAdapter { 

    // Declare variables 
    private Activity adapterActivity; 
    private int layoutResourceId; 
    private ArrayList gridItemsArray; 
    private static LayoutInflater inflater = null; 

    public PhotoGalleryAdapter(Activity a, int layoutResourceId, ArrayList fGridItemArray) { 
     super(a, layoutResourceId, fGridItemArray); 
     this.layoutResourceId = layoutResourceId; 
     this.adapterActivity = a; 
     this.gridItemsArray = fGridItemArray; 
    } 

    public int getCount() { 
     return gridItemsArray.size(); 
    } 

    public Object getItem(int position) { 
     return gridItemsArray.get(position); 
    } 

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

    public View getView(final int position, View convertView, ViewGroup parent) { 
     HolderViewRow holderRow = null; 
     View rowView = (View) convertView; 

     if (rowView == null){ 
      LayoutInflater inflater = adapterActivity.getLayoutInflater(); 

      rowView = inflater.inflate(layoutResourceId, parent, false); 

      holderRow = new HolderViewRow(); 

      holderRow.imageFileBMP = (ImageView) rowView.findViewById(R.id.imageObject); 

      holderRow.checkBox = (CheckBox) rowView.findViewById(R.id.itemCheckBox); 
      holderRow.checkBoxImage = (ImageView) rowView.findViewById(R.id.itemImageCheckBox); 

      rowView.setTag(holderRow); 
     } 
     else 
     { 
      holderRow = (HolderViewRow) rowView.getTag(); 
     } 

     PhotoGalleryItem item = (PhotoGalleryItem) gridItemsArray.get(position); 

     // Set the decoded bitmap iitemnto ImageView 
     holderRow.imageFileBMP.setImageBitmap(item.getImageBMP()); 
     holderRow.imageFilePath = item.getImagePath(); 

     return rowView; 
    } 

    static class HolderViewRow { 
     ImageView imageFileBMP; 
     String imageFilePath; 
     CheckBox checkBox; 
     ImageView checkBoxImage; 
    } 
} 


public class PhotoGalleryItem { 
    private Bitmap imageBMP; 
    private String imagePath; 
    private CheckBox checkBox; 
    private ImageView checkBoxImage; 

    public PhotoGalleryItem(Bitmap imageBMP, String imagePath) { 
     super(); 
     this.imageBMP = imageBMP; 
     this.imagePath = imagePath; 
    } 

    public Bitmap getImageBMP() { 
     return imageBMP; 
    } 

    public void setImageBMP(Bitmap imageBMP) { 
     this.imageBMP = imageBMP; 
    } 

    public String getImagePath() { 
     return imagePath; 
    } 

    public void setImagePath(String imagePath) { 
     this.imagePath = imagePath; 
    } 
} 

L'activité de la grille:

 private void RenderGridAndSetImages() { 
      // Locate the GridView in gridView_PhotoDisplay.xml 
      gridView = (GridView) findViewById(R.id.gridView_PhotoDisplay); 
      // Pass String arrays to Adapter Class 
      imageAdapter = new PhotoGalleryAdapter(this, R.layout.gridview_photo_item, GridItemArrayList); 
      gridView.setAdapter(imageAdapter); 
    } 

Et la fonction qui a le problème:

public void SetVisibilityCheckBox_OnGrid (boolean checkBoxVisibility) { 
     // Handle item selection On GRIDVIEW ImageItem 
     final int size = gridView.getCount(); 
     try { 
      ImageView imageCB; 
      int cbVisibility; 

      if (checkBoxVisibility) 
       cbVisibility = View.VISIBLE; 
      else 
       cbVisibility = View.INVISIBLE; 

      for(int i = 0; i < size; i++) { 
       View viewItem = (View) gridView.getChildAt(i); 
       if (viewItem != null) { 
        imageCB = (ImageView) viewItem.findViewById(R.id.itemImageCheckBox); 
        imageCB.setVisibility(cbVisibility); 
       } 
      } 
     } 
     catch (Exception ex) { 
      // Error occurred while SetSelectCheckBoxOnGrid 
      Log.e(PACKAGE_NAME, ACTIVITY_NAME + ".SetVisibilityCheckBox_OnGrid\n" + ex.getMessage()); 
     } 
    } 

La mise en page GridView:

<RelativeLayout 
    android:id="@+id/layout_Holder" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    android:background="@color/activityBackground" 
    tools:context="com.mountain.saymera.PhotoGalleryActivity"> 

    <!-- Image view: layout_GridView --> 
    <RelativeLayout 
     android:id="@+id/layout_PhotoGridDisplay" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:orientation="horizontal" 
     android:background="@color/activityBackground" 
     android:padding="1dp"> 

     <GridView 
      android:id="@+id/gridView_PhotoDisplay" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:columnWidth="100dp" 
      android:drawSelectorOnTop="true" 
      android:numColumns="auto_fit" 
      android:verticalSpacing="1dp" 
      android:horizontalSpacing="1dp" 
      android:stretchMode="columnWidth" 
      android:gravity="center" 
      android:focusable="true" 
      android:clickable="true"/> 

     <TextView 
      android:id="@+id/textView_NoImages" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/gallery_no_images" 
      android:layout_centerVertical="true" 
      android:layout_centerHorizontal="true" 
      android:background="#00000000" 
      android:textColor="@color/MenuButtonTint" 
      android:textStyle="bold" /> 
    </RelativeLayout> 
</RelativeLayout> 

GridView Mise en page de l'article:

<RelativeLayout 
    android:id="@+id/layout_Holder" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="@drawable/single_photo_frame_on_grid"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center_vertical" 
     android:orientation="vertical" 
     android:background="@color/Grid_ItemFrame" 
     android:padding="0.3dp"> 

     <com.mountain.saymera.SquareImageView 
      android:id="@+id/imageObject" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:adjustViewBounds="true" 
      android:scaleType="centerCrop"/> 
    </LinearLayout> 

    <CheckBox 
     android:id="@+id/itemCheckBox" 
     android:layout_width="20dp" 
     android:layout_height="20dp" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:visibility="invisible" 
     android:tint="@color/Grid_ItemCheckbox"/> 

    <ImageView 
     android:id="@+id/itemImageCheckBox" 
     android:layout_width="25dp" 
     android:layout_height="25dp" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:visibility="invisible" 
     android:background="#00000000" 
     android:src="@mipmap/ic_crop_square_black_24dp" 
     android:tint="@color/MenuCheckboxTint"/> 

</RelativeLayout> 

Besoin d'aide, Merci

+0

s'il vous plaît ajouter les journaux de plantage – nomag

+0

Merci, L'application ne plante pas, donc il n'y a pas d'erreurs sur le journal. 48 images sont affichées sur la grille, mais GridView.getChildAt() a uniquement accès aux 28 premiers éléments, alors que les autres éléments retournent null. Je ne sais pas si cela a quelque chose avec le problème mais j'ai remarqué que lorsque les éléments sont affichés sur l'écran GridView.getChildAt() retourne les éléments, mais quand je dois faire défiler d'autres images, ce sont les images qui retourne null. – Shahar

Répondre

0

J'ai fait face à la même question avec ImageViews programatically ajoutée dans un LinearLayout. Malheureusement, cette méthode semble être buggeuse pour le moment, alors j'ai dû m'aider en trouvant une alternative. Pour contourner le problème, j'ai enregistré les références de mes images dans une liste et j'ai travaillé avec elles.

+1

Cela devrait être un commentaire, pas une réponse, car il ne répond pas réellement à la question –

+1

Ceci ne fournit pas de réponse à la question. Une fois que vous avez suffisamment [réputation] (https://stackoverflow.com/help/whats-reputation) vous pourrez [commenter n'importe quel article] (https://stackoverflow.com/help/privileges/comment); Au lieu de cela, [fournissez des réponses qui ne nécessitent pas de précisions de la part du demandeur] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- je-fais-à la place). - [De l'examen] (/ review/low-quality-posts/17972334) – Anton