Victor Gallo
Victor Gallo

Reputation: 77

Custom Gridview in fragment not populating

I'm trying to create a custom gridview inside a fragment that should look something like this:

https://i.sstatic.net/Su8aO.jpg

So I created a FragmentLayout that contains the image and the label:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >

    <ImageView
    android:id="@+id/grid_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
     />

    <TextView
        android:id="@+id/grid_label"
        android:layout_width="fill_parent"
        android:layout_height="45dp"
        android:layout_marginTop="175dp"    
        android:background="@drawable/label"
        android:gravity="center"
        android:textColor="#FFFFFF"
        android:textSize="12sp"
        android:textStyle="bold" />

The adapter that manages the FragmentLayout looks like this:

public class CustomGridAdapter extends BaseAdapter{

private Context mContext;
private final String[] label;
private final int[] imgId;
  public CustomGridAdapter(Context c,String[] label,int[] imgId ) {
      mContext = c;
      this.imgId = imgId;
      this.label = label;
  }

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View grid;
      LayoutInflater inflater = (LayoutInflater) mContext
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          if (convertView == null) {
            grid = new View(mContext);
        grid = inflater.inflate(R.layout.image_button_layout, null);
            TextView textView = (TextView) grid.findViewById(R.id.grid_label);
            ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image);
            textView.setText(label[position]);
            imageView.setImageResource(imgId[position]);
          } else {
            grid = (View) convertView;
          }
      return grid;
}   

}

The fragment grid is as follows:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<GridView
    android:numColumns="auto_fit"
    android:gravity="center"
    android:columnWidth="90dp"
    android:stretchMode="columnWidth"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/form_grid"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
     />

</LinearLayout>

I'm creating this from the onCreateView method, I'm using onclickListener so the images work as buttons and display a toast when pressed:

 @Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_layout_softdrinks, container, false);

    GridView grid = (GridView) rootView.findViewById(R.id.form_grid);

    CustomGridAdapter adapter = new CustomGridAdapter(rootView.getContext(), label, imgId); //label and imgId are arrays containing strings and int respectively

    grid.setAdapter(adapter);

    grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            Toast.makeText(inflater.getContext(), "You Clicked at " +label[+ position], Toast.LENGTH_SHORT).show();
        }
    });

    return rootView;        
}

The problem is that when I run the code, the screen is blank, so the gridview is not being populated. Any advice on this?

Upvotes: 0

Views: 1516

Answers (1)

Mike
Mike

Reputation: 857

First of all you will need to provide a payload in imgId array and label array.

Then your grid view won't inflate as well because you are returning 0 in your getCount method!

To inflate your layout replace in your getCount method

Return 0;

With

Return imgId.length;

The getCount method tells the base adapter how much images or strings(..data) you have in your array which you want to inflate in the grid view. If you returning 0, base adapter thinks that there are 0 data to inflate.

Upvotes: 1

Related Questions