0

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;
    }


}
Sunny
  • 2,074
  • 4
  • 24
  • 33

0 Answers0