Search code examples
javaandroidgridviewadapter

Android GridView not showing images


I have made a GridView with an ImageAdapter but it does not show the images inside. I tried to change numColumns, columnWidth and other attributes but it didn't work. In Android Studio xml Design panel i can see my Gridview.

This is my gridview inside my xml layout file:

 <GridView
    android:id="@+id/gridview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/linear_buttons"
    android:layout_above="@+id/btnSearch"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:background="@null"
    android:columnWidth="120dp"
    android:gravity="center"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth" />

This is my Adapter:

public class CustomGridViewAdapter extends BaseAdapter {
private final Context mContext;

public CustomGridViewAdapter(Context c) {
    mContext = c;
}

public int getCount() {
    return mThumbIds.length;
}

public Object getItem(int position) {
    return null;
}

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

// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) { 
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(R.dimen.grid_dimens_width, R.dimen.grid_dimens_height));
        imageView.setScaleType(ImageView.ScaleType.CENTER);
        imageView.setPadding(1, 5, 1, 1);
    } else {
        imageView = (ImageView) convertView;
    }

    imageView.setImageResource(mThumbIds[position]);
    return imageView;
}

private final Integer[] mThumbIds = {
        R.drawable.grid_agapis, R.drawable.grid_asteies, R.drawable.grid_auto,
        R.drawable.grid_gamos, R.drawable.grid_goneis,
};

I set the adapter with the following code:

GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new CustomGridViewAdapter(this));
    gridview.setOnItemClickListener(this);

Can you explain me where is the problem? Thank you.


Solution

  • imageView.setLayoutParams(new GridView.LayoutParams(R.dimen.grid_dimens_width,
                                                        R.dimen.grid_dimens_height));
    

    With this line of code you are trying to limit the size of the grabbed drawable to a fixed width & height that are equal to grid_dimens_width & grid_dimens_height respectively.

    But actually using R.dimen.foo won't return the value of foo, instead it returns the generated integer value of the resource itself which can be something like a big number (e.g. -21893103 or 33238590) .. this will make you see nothing on the screen because the image is either:

    • Too big (in case of a positive resource value 33238590) so you are seeing the tiny pixels of it
    • or too small (in case of a negative resource value -21893103) because its size is zero.

    What you need to do instead is to get the dimen resource using getDimention() and pass the resource id to it.

    To apply that to your code:

    Replace:

    imageView.setLayoutParams(new GridView.LayoutParams(R.dimen.grid_dimens_width,
                                                        R.dimen.grid_dimens_height));
    

    With:

    imageView.setLayoutParams(new GridView.LayoutParams(
                      (int) mContext.getResources().getDimension(R.dimen.grid_dimens_width),
                      (int) mContext.getResources().getDimension(R.dimen.grid_dimens_height)));
    

    Result:

    enter image description here