Reputation: 280
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
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
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
Reputation: 9
Do This in you code
adapter.notifyDataSetChanged();
adapter.getItemPosition(0);
It will Help you.
Upvotes: 0
Reputation: 1506
do this:
mCinemaTabAdapter.notifyDataSetChanged();
mCinemaTabAdapter.getItemPosition(0);
instead of:
mViewPager.getAdapter().notifyDataSetChanged();
mViewPager.getAdapter().getItemPosition(0);
Upvotes: 0
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
Reputation: 272
mDataCinemas = cinemasModels;
to
mDataCinemas.clear();
mDataCinemas.addAll(cinemasModels);
and the call notifyDataSetChange. I think that will help you
Upvotes: 0