Search code examples
android-fragmentsandroid-viewpagerfragmentpageradapter

Getting a Fragment inside a ViewPager in Android using getRegisteredFragment returns null


I've been searching a lot and I can't make it work.

I have a problem trying to get fragments inside a viewpager with a tabstrip.

I've implemented a SparseArray as I read here and several methods that I found here but I can't make it work.

The thing is that everytime I call adapter.getRegisteredFragment(position).. I always receive null unless I made it inside the onPageSelected event of the tabsStrip, there it works.. but I don't want to get the fragments there.

Those are my classes:

My fragment:

public class WeekFragment extends Fragment implements View.OnClickListener
{
    private static final String ARG_POSITION = "position";

    private int position;

    private LinearLayout[] btns;

    public static WeekFragment newInstance(int position) {
        WeekFragment f = new WeekFragment();
        Bundle b = new Bundle();
        b.putInt(ARG_POSITION, position);
        f.setArguments(b);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        position = getArguments().getInt(ARG_POSITION);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);
        fillFragment();
    }

    private void fillFragment()
    {
        // Irrelevant stuff..
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance)
    {
        return inflater.inflate(R.layout.week_fragment, container, false);
    }

    @Override
    public void onClick(View v)
    {
        // Irrelevant stuff
    }

    public LinearLayout[] getBtns()
    {
        return btns;
    }

    public void setBtns(LinearLayout[] btns)
    {
        this.btns = btns;
    }
}

My adapter:

public class WeekAdapter extends FragmentPagerAdapter
{
    Calendar cal;
    Context context;
    SparseArray<Fragment> registeredFragments;

    private String[] TITLES = new String[6];

    public WeekAdapter(FragmentManager fm, Context context)
    {
        super(fm);
        registeredFragments = new SparseArray<>();
        this.context = context;
        fillTitles();
    }

    private void fillTitles()
    {
        // Fill titles
    }


    @Override
    public CharSequence getPageTitle(int position)
    {
        return TITLES[position];
    }

    @Override
    public int getCount()
    {
        return TITLES.length;
    }

    @Override
    public Fragment getItem(int position)
    {
        return WeekFragment.newInstance(position);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);
    }

    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }
}

and my activity:

public class MyActivity extends FragmentActivity
{

    private PagerSlidingTabStrip tabs;
    private ViewPager pager;
    private WeekAdapter adapter;
    private List<DayResumeItem> listDayResumesItems;
    private User u;
    private View mProgressView;
    private View mRotaView;

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

        mProgressView = findViewById(R.id.view_progress);
        mRotaView = findViewById(R.id.view_rota);

        this.u = this.getIntent().getExtras().getParcelable(getString(R.string.parcel_user));

        // Initialize the ViewPager and set an adapter
        pager = (ViewPager) findViewById(R.id.pager);
        adapter = new WeekAdapter(getSupportFragmentManager(), getApplicationContext());
        pager.setAdapter(adapter);

        // Bind the tabs to the ViewPager
        tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
        tabs.setViewPager(pager);
        tabs.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
        {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
            {
                WeekFragment f = (WeekFragment)adapter.getRegisteredFragment(week);
                // Do stuff.. Here, f is not null. Here I can work, but I don't want to.
            }

            @Override
            public void onPageSelected(int position)
            {

            }

            @Override
            public void onPageScrollStateChanged(int state)
            {

            }
        });

        WeekFragment f = (WeekFragment)adapter.getRegisteredFragment(week);
        // Do stuff.. Here, f is null and I can't work.

    }

    @Override
    protected void onResume()
    {
        super.onResume();
        getList();
    }


}

It is everytime I call adapter.getRegisteredFragment(position) on my activity where it crash because it always return null..

I swear that I've been searching a lot but I'm unable to make it work.

Thank you very much everybody!


Solution

  • I think my problem was that I was calling this adapter.getRegisteredFragment(position) in the onCreate of my activity, and in the onCreate, the viewpager is still not fully loaded and the registeredFragments aren't still instantiated, so the list is still empty..

    If you move this callings to another place when the viewpager is fully loaded, it will work.