silversunhunter
silversunhunter

Reputation: 1269

Programatically creating and populating viewpager fragment. result is null

I am going through the Android Developer guide on View Paging with fragments and am stuck at populating the fragment from my main onCreate method. I think I am confused as to what methods get called when to populate the fragment as I am getting null values.

My Fragment Class

public class CatalogFragment extends Fragment {
    private String filename;
    private String author;
    private String title;

    public CatalogFragment(String f, String t, String a){
        filename = f;
        author = a;
        title = t;
        Log.d("frag", f+" | "+t+" | "+a);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.catalog_fragment,  container, false);
        ImageView imgView = (ImageView) rootView.findViewById(R.id.imgFrag);
        Bitmap bmp = BitmapFactory.decodeFile(filename);
        imgView.setImageBitmap(bmp);
        TextView txtView = (TextView)rootView.findViewById(R.id.title_text);
        txtView.setText(author+": "+title);
        return rootView;
    }
}

My onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_catalog_view);

    //Instantiate a ViewPager and a PagerAdapter
    mPager = (ViewPager) findViewById(R.id.pager);
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mPagerAdapter);

    //populate the fragment
    //I was thinking I could pass the fragment class the necessary information to put an imageview and text view in place.

    List<Poster> posters = db.getAllPosters();
    for (Poster p : posters) {
        final String filename = p.getPosterFilename();

    //Create a new Fragment?
        new CatalogFragment(filename, p.getPosterTitle(), p.getPresenterFname()+" "+p.getPresenterLname());

    }

}

However it appears that getItem is what is actually being called to populate the fragment. I think. If I put null in for the arguments that is what I get. If I try to omit this line eclipse starts to complatin. So I am stuck.

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{

        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
            // TODO Auto-generated constructor stub
        }

        @Override
        public Fragment getItem(int position){
            return new CatalogFragment(null, null, null);
        }

        @Override
        public int getCount(){
            return NUM_PAGES;
        }

    }

Upvotes: 0

Views: 1285

Answers (1)

blad
blad

Reputation: 664

The Adapter is what creates the fragments in the view pager, you do not need to create them yourself.

Here is what the Adapter and Activity#onCreate could look like to give you the correct result.

Notice how we are telling the adapter where to get it's data.

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_catalog_view);

    //Instantiate a ViewPager and a PagerAdapter
    mPager = (ViewPager) findViewById(R.id.pager);

    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
    mPagetAdapter.setData(db.getAllPosters()); // Provide Poster Data to Adapter
    mPager.setAdapter(mPagerAdapter);
}

In the adapter we tell it how to build it's fragments:

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    List<Poster> posterList = new ArrayList<Poster>(0);
    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
        // TODO Auto-generated constructor stub
    }

    public void setData(List<Poster> posters) {
        posterList.addAll(posters);
    }

    @Override
    public Fragment getItem(int position){
        Poster poster = posterList.get(position)
        // FRAGMENTS SHOULD NOT IMPLEMENT A CONTRUCTOR!!!
        // This will lead to other issue down the line.
        return new CatalogFragment(poster.getPosterFilename(), poster.getPosterTitle(), poster.getPresenterFname()+" "+poster.getPresenterLname());
    }

    @Override
    public int getCount(){
        return posterList.size();
    }

}

```

As a side-note, you should not have a fragment constructor with arguments. See this other SO question for an explanation: Do fragments really need an empty constructor?

Upvotes: 1

Related Questions