2017-09-28 1 views
2

Ich habe ein Raster von Bildern, die von einer benutzerdefinierten Kameraaktivität genommen wurden. Bei anderen Aktivitäten lade ich die Bilder in ein Raster. Ich habe eine Methode, die & von einem Kontrollkästchen auf jedem Bild einschalten. Beim Versuch, sich durch alle Bilder zu bewegen, erhalte ich seltsames Verhalten: GridView.getCount() gibt die korrekte Anzahl von Bildern in der GridView zurück, aber die GridView.getChildAt() -Methode gab nur einen Teil der Bilder zurück. Also, wenn ich es versuche, bekomme ich eine Null-Ausnahme.GridView getChildAt null für sichtbare Kinder

Das Gridview-Adapter:

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

The Grid Aktivität:

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

Und die Funktion, die das Problem hat:

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

Das Gridview-Layout:

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

Das Gridview Artikel Layout:

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

etwas Hilfe benötigen, Dank

+0

fügen Sie bitte Crash-Logs hinzu – nomag

+0

Danke, Die Anwendung stürzt nicht ab, so dass es keine Fehler im Protokoll gibt. Es gibt 48 Bilder, die auf dem Raster angezeigt werden, aber GridView.getChildAt() hat nur Zugriff auf die ersten 28 Elemente, andere Elemente geben null zurück. Ich weiß nicht, ob es etwas mit dem Problem hat, aber ich habe festgestellt, dass GridView.getChildAt() die Elemente zurückgibt, wenn die Elemente auf dem Bildschirm angezeigt werden, aber wenn ich zu anderen Bildern scrollen muss, sind das die Bilder, die Zurückgeben von null – Shahar

Antwort

0

ich das gleiche Problem mit programmatisch hinzugefügt ImageViews in einem Linearlayout konfrontiert. Leider scheint diese Methode im Moment fehlerhaft zu sein, also musste ich mir selbst helfen, indem ich eine Alternative fand. Als Workaround habe ich die Referenzen meiner ImageViews in einer Liste gespeichert und mit ihnen gearbeitet.

+1

Dies sollte ein Kommentar sein, keine Antwort, da es die Frage –

+1

nicht tatsächlich beantwortet Dies liefert keine Antwort auf die Frage. Sobald Sie genug [Reputation] (https://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (https://stackoverflow.com/help/privileges/comment); Stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (https://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/17972334) – Anton

Verwandte Themen