Naila
Naila

Reputation: 280

Data not updating in Android view pager

I have a fragment in which I am inserting a tab layout with view pager. The issue is my adapter doesn't update the data when I am getting data in my onSuccess method from the server. It gets initialized before my onSuccess method is called. How can I tell my adapter to re-consider my data? I have tried notifyDataSetChanged() but it doesn't work.

My Fragment

public class CinemaFragmentLandingPage extends BaseHomeFragment implements View.OnClickListener, TabLayout.OnTabSelectedListener, CinemasContract.View {

private CinemasContract.Presenter mPresenterCinemas;

private ViewPager mViewPager;

private TabLayout mTabLayout;

private CinemaFragmentTabAdapter mCinemaTabAdapter;

private List<CinemasModel> mDataCinemas;

public static CinemaFragmentLandingPage newInstance() {
    return new CinemaFragmentLandingPage();
}

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

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

    mDataCinemas = new ArrayList<>();

    mPresenterCinemas.getCinemas();

    initViews(rootView);

    return rootView;
}

private void initViews(View rootView) {
    mTabLayout = rootView.findViewById(R.id.tab_layout);

    mTabLayout.addTab(mTabLayout.newTab().setText(getResources().getString(R.string.cinemas)));

    mTabLayout.addTab(mTabLayout.newTab().setText(getResources().getString(R.string.films)));

    mViewPager = rootView.findViewById(R.id.pager);

    mCinemaTabAdapter = new CinemaFragmentTabAdapter(this.getChildFragmentManager(), 2, mDataCinemas);

    mViewPager.setAdapter(mCinemaTabAdapter);

    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));

    mTabLayout.setOnTabSelectedListener(this);

}

@Override
public void onClick(View view) {

}

@Override
public void onTabSelected(TabLayout.Tab tab) {
    mViewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(TabLayout.Tab tab) {

}

@Override
public void onTabReselected(TabLayout.Tab tab) {

}

@Override
public void setLoading(boolean isActive) {
    mHomeActivity.setLoadingDialog(isActive);
}

@Override
public void showGetCinemasSuccess(List<CinemasModel> cinemasModels) {
    setLoading(false);
    mDataCinemas = cinemasModels;
    mViewPager.getAdapter().notifyDataSetChanged();
    mViewPager.getAdapter().getItemPosition(0);
}

@Override
public void showGetCinemasFail(int errorCode) {
    setLoading(false);
}

@Override
public void setPresenter(CinemasContract.Presenter presenter) {
    mPresenterCinemas = Preconditions.checkNotNull(presenter);
}

}

My Adapter

public class CinemaFragmentTabAdapter extends FragmentStatePagerAdapter {

private int mNumOfTabs;

private ArrayList<CinemasModel> mCinemasData;

public CinemaFragmentTabAdapter(FragmentManager fm, int numOfTabs, List<CinemasModel> cinemasData) {
    super(fm);
    this.mNumOfTabs = numOfTabs;
    this.mCinemasData = new ArrayList<CinemasModel>();
    this.mCinemasData.addAll(cinemasData);
}

@Override
public Fragment getItem(int position) {
    Fragment tab = null;
    Bundle cinemasBundle = new Bundle();
    cinemasBundle.putParcelableArrayList("cinemas", this.mCinemasData);

    switch (position) {

        case 0:
            tab = new CinemaFragment();
            tab.setArguments(cinemasBundle);
            break;

        case 1:
            tab = new FilmsFragment();
            tab.setArguments(cinemasBundle);
            break;

        default:
            break;
    }
    return tab;
}

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

Any help will be appreciated.

Upvotes: 1

Views: 91

Answers (6)

Vadim Eksler
Vadim Eksler

Reputation: 887

Try to make method updateData(ArrayList mCinemasData) in your adapter and on method showGetCinemasSuccess(data) { adapter.updateData(data) } and notifyDataSetChange after.

Upvotes: 0

Dnyaneshwar Panchal
Dnyaneshwar Panchal

Reputation: 444

Firstly define constructor in your pojo class, Like..

  public CinemasModel(String title, String description, String imageUrl, String author, String url) {

        this.title = title;
        this.description = description;
        this.imageUrl = imageUrl;
        this.author = author;
        this.url = url;
    }

Then update this code.

 CinemasModel cinemas= new CinemasModel(title, description, url, imageUrl, author);

 mDataCinemas.add(cinemas);
 System.out.println("mDataCinemas size = " + mDataCinemas.size());

 mCinemaTabAdapter = new inemaFragmentTabAdapter(getActivity(), mDataCinemas);
 mViewPager.setAdapter(mCinemaTabAdapter );
 mCinemaTabAdapter.notifyDataSetChanged();

Note : In pojo class update your parameters instead of title , descriptio, etc. I hope it will help for you..

Upvotes: 1

Navneet
Navneet

Reputation: 9

Do This in you code

adapter.notifyDataSetChanged();
adapter.getItemPosition(0);

It will Help you.

Upvotes: 0

rya
rya

Reputation: 1506

do this:

mCinemaTabAdapter.notifyDataSetChanged();
mCinemaTabAdapter.getItemPosition(0);

instead of:

mViewPager.getAdapter().notifyDataSetChanged();
mViewPager.getAdapter().getItemPosition(0);

Upvotes: 0

KURUMADDALI ANURAG
KURUMADDALI ANURAG

Reputation: 106

Add a method refresh with one parameter as ArrayList mCinemasData in viewpager adapter, and inside the method add below 2 lines this.mCinemasData = mCinemasData; notifyDataSetChanged(); Call the method from onsuccess and let me know what happen?

Upvotes: 0

Md Jubayer
Md Jubayer

Reputation: 272

mDataCinemas = cinemasModels;

to

mDataCinemas.clear();
mDataCinemas.addAll(cinemasModels);

and the call notifyDataSetChange. I think that will help you

Upvotes: 0

Related Questions