Search code examples
androidandroid-fragmentsandroid-viewpager

Fragment is blank in ViewPager


First off: I am aware there are a number of similar questions, however, none of the suggestions worked.

I have a ViewPager that I would like to use with fragments. The ViewPager works, and I can see in the log that I can scroll left and right. I can see the animation when I try to scroll left and there's no previous item (or right when there's no following item). However, the screen remains blank. The fragment itself is functional, however, I've tried it in a different context.

I am using the androidx namespaced packages.

Things I've tried (<--> means I've tried both):

  • FragmentPagerAdapter <--> FragmentStatePagerAdapter
  • getFragmentManager() <--> getChildFragmentManager()as the FragmentManager for the adapter
  • setSaveFromParentEnabled to false.
  • setOffscreenPageLimit to the number of fragments.

Relevant code (I have taken out sections of code that are irrelevant to this question):

The Fragment that contains the ViewPager:

public class AddListingMediaFragment extends Fragment {

    private ViewPager viewPagerTop;
    private AddMediaAdapter addMediaAdapter;

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

        View view =  inflater.inflate(R.layout.fragment_add_listing_media, container, false);
        setupViewPagerTop(view);
        return view;
    }

    private void setupViewPagerTop(View view) {
        viewPagerTop = view.findViewById(R.id.view_pager_top);
        addMediaAdapter = new AddMediaAdapter(getChildFragmentManager());
        viewPagerTop.setAdapter(addMediaAdapter);
        viewPagerTop.setSaveFromParentEnabled(false);
        viewPagerTop.setOffscreenPageLimit(5);
    }
}

The Adapter (please do note, as mentioned, that I've tried both FragmentPagerAdapter and FragmentStatePagerAdapter:

public class AddMediaAdapter extends FragmentPagerAdapter {
    private static final String TAG = AddMediaAdapter.class.getSimpleName();

    public AddMediaAdapter(FragmentManager fm) {
        super(fm);
    }

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

    @Override
    public Fragment getItem(int position) {
        Log.i(TAG, "getItem: " + String.valueOf(position));
        return new AddListingMediaCameraFragment();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }
}

The layout file:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager_top"
        android:layout_width="300dp"
        android:layout_height="300dp"
        />

    <include
        layout="@layout/bottom_sheet_add_listing_media_gallery"
        />


</androidx.coordinatorlayout.widget.CoordinatorLayout>

Solution

  • You do not need to override isViewFromObject in your adapter, FragmentPagerAdapter has already taken care of it. ViewPager calls this method to decide how to render the pages.

    Your view == object will return false because the object is always a Fragment not a View. So just drop the override, and it will fix the issue.