0

Sorry for my english. I have one activity and in this activity in FragmentPagerAdapter exist 5 fragments. All fragments use one object model for inforation(product name, product image ...).

My activity get data from data base. And then it data send to all fragments. My example Activity:

           @BindView(R.id.tabs_sep_prod) TabLayout tabs_sep_prod;
            @BindView(R.id.viewpager_sep_prod) ViewPager viewpager_sep_prod;
            PrepBaseProdFragment prepBaseProdFragment;

         @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_sep_product);
                ButterKnife.bind(this);

                prepBaseProdFragment = new PrepBaseProdFragment();
                // there i have another fragments
                // ...
                setupViewPager(viewpager_sep_prod);
                tabs_sep_prod.setupWithViewPager(viewpager_sep_prod);
        }

         private void setupViewPager(ViewPager viewPager) {
                SepProductActivity.ViewPagerAdapter adapter = new SepProductActivity.ViewPagerAdapter(
                adapter.addFrag(prepBaseProdFragment, getString(R.string.sep_prep_base));
                 // there i have another addFrag
                // ...
                viewPager.setOffscreenPageLimit(5);
                viewPager.setAdapter(adapter);
            }

     @Override
        public void onResume() {
            super.onResume();
        // this i call method from presenter, it return data in method setData
            if(idCat != null && idProd != null)
                sepProductPresenter.getSepProd(idCat, idProd);
        }

    @Override
        public void setData(SepProductModel sepProductModel) {
        // there i send data to fragment
            prepBaseProdFragment.setDataInf(sepProductModel);
        // ...
        }

class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

my fragment

public class PrepBaseProdFragment extends BaseFragment {

    @BindView(R.id.text) TextView text;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_about_prod_prepare_base, parent, false);
        ButterKnife.bind(this, view);
        Log.e("PrepBaseProdFragment", "PrepBaseProdFragment");

        return view;
    }

    public void setDataInf(SepProductModel sepProductModel) {
        text.setText(sepProductModel.getPROPERTY_PR_SUBSTRPREP_UA_VALUE().getTEXT());
    }

}

My question: when i send data from activity to fragment, my view do not have time to initialize. In fragment line text.setText(sepProductModel.getPROPERTY_PR_SUBSTRPREP_UA_VALUE().getTEXT()); error

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

Please, help me solve my problem. I spend many times for this

r1299597
  • 439
  • 2
  • 6
  • 16
  • Because the official method is suggested by those 2 ppl, you could take another shot for EventBus, very easy and lightway :) – kidnan1991 Jul 17 '18 at 15:52

2 Answers2

1

You can check if the text view is null save the data in a variable inside the fragment and in onCreateView use the data variable if it is filled and set the textview text. Something like this:

// Inside the Fragment body
private SepProductModel sepProductModel;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_about_prod_prepare_base, parent, false);
    ButterKnife.bind(this, view);
    Log.e("PrepBaseProdFragment", "PrepBaseProdFragment");
    if(this.sepProductModel != null)
        text.setText(this.sepProductModel.getPROPERTY_PR_SUBSTRPREP_UA_VALUE().getTEXT());
    return view;
}

public void setDataInf(SepProductModel sepProductModel) {
     if(text != null){
         // use text 
     }
     else this.sepProductModel=sepProductModel;
}
Mushtu
  • 358
  • 2
  • 11
1

I can advise you to wait for your data and then show fragments to adapter, moreover all of them use the same model. While you dont have data, you can show progress bar. When you have needed model, you can create instances of your fragments and set bundle arguments for them. You can use method like this:

public static MyFragment newInstance(MyModel model){
    MyFragment fragment = new MyFragment();
    Bundle args = new Bundle();
    args.putSerializable(KEY, model);//or args.putParcelable(KEY, model);
    fragment.setArguments(args);
    return fragment;
}

Notice: your model need to implement Serializable or Parcelable to be putted in bundle. You may read about difference here. Then in your set data method, when you already have your model you can setup your adapter and set it to view pager, but with this approach:

adapter.addFrag(MyFragment.newInstance(model), getString(R.string.sep_prep_base));

It have to help you, ask me if you have some questions.

H.Taras
  • 609
  • 3
  • 10