Vicent
Vicent

Reputation: 5452

GridView inside a Fragment: getView is never called

I have an Activity with a layout made of two Fragment. One of the fragments layout contains a GridView.

public class PicturesGallery extends FragmentActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gallery_frames);

        Fragment galleryFragment = fm.findFragmentById(R.id.gallery_fragment);
        if (galleryFragment == null) {
           fm.beginTransaction().add(R.id.gallery_fragment, new GalleryFragment()).commit();
        }
        ...

When this fragment is called it instantiates the adapter for the GridView, inflates the GridView and sets the adapter (which has been fed with an ArrayList with 15 items to be displayed).

public class GalleryFragment extends Fragment {
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Initialize the layout Adapter
        PicturesGallery pga = (PicturesGallery) getActivity();
        mAdapter = new ImageAdapter(pga.getApplication(), pga.mMemoryCache,
                galleryDir);
        mAdapter.mPictureNames = new ArrayList<String>(pictureNames);

        // Inflate the layout and set the adapter
        LayoutInflater inflater = (LayoutInflater) getActivity()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        GridView gridView = (GridView) inflater.inflate(R.layout.pictures_gallery_fragment, null);
        gridView.setAdapter(mAdapter);
    }
    ....

But when the activity is executed nothing happens (no errors in the logcat but nothing displayed on the GridView). In the adapter class, using Log.d() inside getView() indicates that the method is never called. However getCount() returns the right number of items. The relevant code follows.

public class ImageAdapter extends BaseAdapter {
    ...
    public ArrayList<String> mPictureNames = new ArrayList<String>();
    public ImageAdapter(Context c, LruCache<String, Bitmap> mCache, File gallery) {
        mMemoryCache = mCache;
        mGalleryDir = gallery;
        mInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        Log.d("dupa", "getView");
        ViewHolder vh;
        View cell = convertView;
        if (cell == null) {
            vh = new ViewHolder();
            cell = mInflater.inflate(R.layout.galleryitem, null);
            // Populate the ViewHolder
            vh.checkBox = (CheckBox) cell.findViewById(R.id.itemCheckBox);
            ...
            cell.setTag(vh);
            ...
        } else {
            vh = (ViewHolder) cell.getTag();
        }
        // Update the cell View state
        vh.checkBox.setTag(position);
        ...
        return cell;
    }

I've not included xml files because the post is lengthy. If you think they are needed (or you need more code) just tell me. Any help will be greatly appreciated. TIA.

Upvotes: 0

Views: 2788

Answers (1)

RaB
RaB

Reputation: 1565

You need to implement onCreateView() in your fragment and return the inflated layout there (note to use the inflate method that doesnt add the inflated view to the container. http://developer.android.com/reference/android/app/Fragment.html#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)

Just like in the example at the top of the page

/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("Fragment #" + mNum);
    tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
    return v;
}

There you can remember the instance to the GridView and then in onActivityCreated (or potentially in onAttach() you can set the adapter.

Upvotes: 1

Related Questions