0

I have a tablayout (with 3 tabs) with viewpager and fragments.

I m trying to send the parsed Json data from MainActivity( When searchview data submitted ) to show in the textview of tabs fragments

See this Image link

The data is succesfully parsing but textview with data(in first tab) is not showing unless scrolled to 3rd tab

//Passing data from MainActivity

public String getMyData() {
    return meaning;
}

//Setting value to textview from Fragment

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
   // Inflate the layout for this fragment
   View v=inflater.inflate(R.layout.fragment_meaning, container, false);

   MainActivity mainActivity= (MainActivity) getActivity();
   assert mainActivity != null;
   String data= mainActivity.getMyData();
   TextView textView=v.findViewById(R.id.textVIew);

   textView.setText(data);

   return v;
}

Want to able to show data changes instantly as it is parsed, instead of scrolling to 3rd tab to see changes

3 Answers3

0

Here are some steps that might help you.

On the ViewPager adaptor you have created, make the fragment objects. like below

 FragmentOne fragOne; // this should be global

On the viewPager adaptor, do some thing like this,

fragOne = new FragmentOne() // whatever your implementation is.

Then after fetching the data from the server,

if ( fragOne != null ) {

   fragOne.setValueOnView( " your data to be passed" );

}

and on the FragmentOne, create a function called setValueOnView

 void setValueOnView(String yourString) {
     v.findViewById(R.id.textVIew).setText(yourString);
 }

And one more thing, while initializing the fragment onCreateView, create an object of View

View v;  // global variable

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

  v=inflater.inflate(R.layout.fragment_meaning, container, false);

Use this approach for other fragments as well

Sanoop Surendran
  • 3,484
  • 4
  • 28
  • 49
0

Inside getItem() method in ViewPager class use Fragment constructors with String parameter

@Override
        public Fragment getItem(int position) {

            switch (position) {
                case 0:
                    FragmentOne tab1 = new FragmentOne("string parameter");
                    return tab1;

                case 1:
                    FragmentTwo tab2 = new FragmentTwo("string parameter");
                    return tab2;

                case 2:
                    FragmentThree tab3 = new FragmentThree("string parameter");
                    return tab3;

                default:
                    return null;
            }
        }

Inside your Fragment:

    public FragmentOne(String stringParameter) {
            yourLocalVariable = stringParameter; // yourLocalVariable is declared inside Fragment class; 
//now you can setText() for your TextView inside onViewCreated() 
        }

Of course you pass your String from MainActivity to ViewPager like you did earlier.

SkypeDogg
  • 1,000
  • 2
  • 13
  • 28
0

Use Observer

public class FragmentObserver extends Observable {
        @Override
        public void notifyObservers() {
            setChanged(); // Set the changed flag to true, otherwise observers won't be notified.
            super.notifyObservers();
        }
    }

Activity:

public class MyActivity extends Activity {
    private MyAdapter mPagerAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.my_activity);
        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        mPagerAdapter = new MyAdapter();
        pager.setAdapter(mPagerAdapter);
    }

    private void updateFragments() {
        mPagerAdapter.updateFragments();
    }
}

Viewpager adapter

public class MyAdapter extends FragmentPagerAdapter {
    private Observable mObservers = new FragmentObserver();

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        mObservers.deleteObservers(); // Clear existing observers.
        Fragment fragment = new MyFragment();
        if(fragment instanceof Observer)
            mObservers.addObserver((Observer) fragment);

        return fragment;
    }

    public void updateFragments() {
        mObservers.notifyObservers();
    }
}

Your Fragment

public class MyFragment extends Fragment implements Observer {

    /* Fragment related stuff... */

    @Override
    public void update(Observable observable, Object data) {
        View root = getView();
        // Update your views here.
    }
}

You will get data to update method even your fragment already loaded

Ganesh Pokale
  • 1,538
  • 1
  • 14
  • 28