I have an application with multiple fragments. My first fragment is HomeFragment where I am using viewpager and recycler view.
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_home, container, false);
ButterKnife.bind(this, view);
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(Constant.HOME_TITLE);
// view Pager
mPager = (ViewPager) view.findViewById(R.id.pager);
// recycler view
rv_transactions.setHasFixedSize(true);
LinearLayoutManager mLayoutmanager = new LinearLayoutManager(getContext());
rv_transactions.setLayoutManager(mLayoutmanager);
}
In HomeFragment's onStart I am doing network call using asyncTask. On compltion of asynctask I have a callback onTaskComplete() where I am setting my list and pager
public void onTaskComplete(JSONObject response){
// some jsonparsing logic, then
TransactionRecyclerViewAdapter adapter = new TransactionRecyclerViewAdapter(cardInfoAndTransactionArrayList.get(0).getTransactions());
Log.d("rv_adapter",""+cardInfoAndTransactionArrayList.get(0).getTransactions());
rv_transactions.setAdapter(adapter);
mPagerAdapter = new MultipleCardPagerAdapter(getChildFragmentManager(), cardInfoAndTransactionArrayList);
Log.d("ArrayList size",""+cardInfoAndTransactionArrayList.size());
Log.d("mPagerAdapter",""+mPagerAdapter);
Log.d("mPager",""+mPager);
mPager.setAdapter(mPagerAdapter);
mPager.addOnPageChangeListener(this);
}
Then there is one fragmentBy the name IgFragment from where I am coming back to HomeFragment
android.support.v4.app.FragmentManager fManager = getActivity().getSupportFragmentManager();
Boolean isPoped = fManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
HomeFragment homeFragment = HomeFragment.newInstance(mobileNumber, "");
FragmentTransaction transaction = fManager.beginTransaction();
transaction.replace(R.id.fragment_container, homeFragment);
transaction.commit();
The flow of app is like HomeFragment --> 1st Frag --> 2nd Frag -->IGFragment --> HomeFragment and I am adding 1 & 2 to addToBackStack(null) to have back button navigation but at IGFragment I am clearing the back stack because I don't want any back navigation behaviour when I am at homeFragment but clearing backstack makes viewPager throw nullpointer exception
logcat output (before exception thrown)
ArrayList size: 2
/mPagerAdapter: com.example.worldline.adapters.MultipleCardPagerAdapter@36efdd11
/mPager: android.support.v4.view.ViewPager{5a27e76 VFED.... ......ID 0,0-1080,486 #7f0f00f8 app:id/pager}
logcat Output (Exception thrown at mPager.setAdapter(mPagerAdapter);)
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
If I dont clear back stack everything works fine but HomeFragment shows multiple fragments one above other on press of back button (but no exception from viewpager) but if I clear backstack it throws null pointer even though arraylist have size 2(logact output printed just before setting adapter to viewpager)
MultipleCardPagerAdapter code
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
import com.example.worldline.pojo.CardInfoAndTransactionsPojo;
import com.example.worldline.r_cug.MultipleCardViewPagerFragment;
import java.util.ArrayList;
/**
* Created by sunny.birman on 28-10-2016.
*/
public class MultipleCardPagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<CardInfoAndTransactionsPojo> cardDetails;
private int cardListLength;
public MultipleCardPagerAdapter(FragmentManager fm, ArrayList<CardInfoAndTransactionsPojo> list) {
super(fm);
this.cardDetails= list;
cardListLength = list.size();
}
@Override
public Fragment getItem(int position) {
return MultipleCardViewPagerFragment.newInstance(cardDetails.get(position).getCardNumber(),cardDetails.get(position).getCardBalance(),position,cardListLength);
}
@Override
public int getCount() {
return cardDetails.size();
}
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE;
}
}