Luis Lavieri
Luis Lavieri

Reputation: 4109

CastException: after Updating Fragment from ViewPager

I'm updating my Fragment number 2 using:

@Override
public int getItemPosition(Object object) {
    FragmentPage2 f = (FragmentPage2) object;
    if (f != null) {
        f.update();
    }
    return super.getItemPosition(object);
}

Now, when I add and additional and different Fragment in getItem(int position), everything seems to be working fine. However, when I run mPager.getAdapter().notifyDataSetChanged(); it throws me:

08-07 19:45:50.844: E/AndroidRuntime(17776): java.lang.ClassCastException: com.foodbuilder.FragmentPage1 cannot be cast to com.foodbuilder.FragmentPage2
08-07 19:45:50.844: E/AndroidRuntime(17776):    at com.foodbuilder.MainActivity$MyAdapter.getItemPosition(MainActivity.java:967)
08-07 19:45:50.844: E/AndroidRuntime(17776):    at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:851)
08-07 19:45:50.844: E/AndroidRuntime(17776):    at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2772)
08-07 19:45:50.844: E/AndroidRuntime(17776):    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
08-07 19:45:50.844: E/AndroidRuntime(17776):    at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
08-07 19:45:50.844: E/AndroidRuntime(17776):    at com.foodbuilder.MainActivity.onDialogPositiveClick(MainActivity.java:888)
08-07 19:45:50.844: E/AndroidRuntime(17776):    at com.foodbuilder.TablesDialogFragment$2.onClick(TablesDialogFragment.java:57)
08-07 19:45:50.844: E/AndroidRuntime(17776):    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
` 

What is happening? Thank you very much.

Upvotes: 1

Views: 151

Answers (1)

Nikola Despotoski
Nikola Despotoski

Reputation: 50538

@Override
public int getItemPosition(Object object) {
    if(object != null && object instanceof FragmentPage2){
        FragmentPage2 f = (FragmentPage2) object;
        f.update();        
    }
    return super.getItemPosition(object);
}

Similarly you can get object class and check if it is assignable from FragmentPage2.class:

if(object.getClass().isAssignalbeFrom(FragmentPage2.class))

This happens because you have different classes that inherit Fragment and getItemPosition() does not care about the type of the object, but the casting you do does care about the type of the object.

Hope it helps.

Upvotes: 1

Related Questions