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
s'il vous plaît ajouter les journaux de plantage – nomag
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