user782104
user782104

Reputation: 13555

Loading order of viewpager in android

Imagine there is a viewpager with 4 page, the 1st and 2nd page are storing the edittext, and the third one need to display the inputed data from 1st and 2nd page.

The problem is , viewpager pre-load the pervious page and next page , if I create the custom adapter like that:

Custom adapter

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        rootView = (LinearLayout) LayoutInflater.from(ctx).inflate(pages[position], null);

        if (position == 0) {
            form1(rootView);
        } else {
            form2(rootView);
        }

        ((ViewPager)container).addView(rootView);
        return rootView;
    }

Example function form2

private void form2(View rootView){
    TextView previous_page = (TextView) rootView.findViewById(R.id.previous_page);
    TextView next_page = (TextView) rootView.findViewById(R.id.next_page);

    final EditText type = (EditText) rootView.findViewById(R.id.edit_type);
    final EditText amount = (EditText) rootView.findViewById(R.id.edit_amount);
    final Spinner period = (Spinner) rootView.findViewById(R.id.edit_period);
    final EditText name = (EditText) rootView.findViewById(R.id.edit_name);
    final EditText phone_no = (EditText) rootView.findViewById(R.id.edit_phone_no);
    final EditText email = (EditText) rootView.findViewById(R.id.edit_email);

    previous_page.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            viewPager.setCurrentItem(0, true);
            top_bar.setImageResource(R.drawable.form_1_header);
        }
    });

    next_page.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            String[] input_list = {amount.getText().toString(),name.getText().toString(),phone_no.getText().toString(),email.getText().toString()};
            String invalid_msg = check_valid(input_list);
            if (invalid_msg.equals("")) {
                new FormHandler(ctx,formListener).execute(type.getText().toString(),amount.getText().toString(),period.getSelectedItem().toString(),name.getText().toString(),phone_no.getText().toString(),email.getText().toString());
            } else {
                Toast.makeText(ctx, invalid_msg ,Toast.LENGTH_LONG).show();
            }
        }
    });
}

Then , for example if I enter the 1st page, it call the instantiateItem 2 times, the position are 0 and 1 , and it called the form1() and the form2(), which I expect only when I enter that page , it call the function of that page . e.g. At 1st page , run form1(), At 2nd page , run form2(). How to fix that? thanks.

Update (1):

It caused a problem, when I enter 2nd tab , it preload the 3rd tab, which call the form3(), so after I input the data in those edittext at 2nd tab, and go to the 3rd tab, it does not call form3() again, so the 3rd tab does not display enter data from 2nd tab (The view was preload and instantiate already)

Update (2):

The page is not a fragment , it is a layout and inflate at the adapter(named "rootview" and the pages array is:)

int[] pages = {R.layout.form_1,R.layout.form_2,R.layout.form_3,R.layout.form_4};

Update (3):

My whole viewpager

    private class ViewPageAdapter extends PagerAdapter {
    // Declare Variables
    public int[] pages;
    private LinearLayout rootView;

    public ViewPageAdapter(int[] _pages) {
        pages = _pages;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == (LinearLayout) object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        rootView = (LinearLayout) LayoutInflater.from(ctx).inflate(
                pages[position], null);

        if (position == 0) {
            form1(rootView);
        } else if (position == 1) {
            form2(rootView);
        } else if (position == 2) {
            form3(rootView);
        } else if (position == 3) {
            form4(rootView);
        }

        ((ViewPager) container).addView(rootView);
        return rootView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((LinearLayout) object);
    }

    @Override
    public int getCount() {
        return pages.length;
    }
}

Upvotes: 1

Views: 1465

Answers (2)

manivannan
manivannan

Reputation: 622

You can override the setPrimaryItem method in adapter. this method will give the current displaying object. This may help you.

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    if (mobject != object) {
      mObject=objet; //mObject is global variable in adapter
      //You can update your based on your logic like below 
      View view == (LinearLayout) object;
      form4(view);
    }
    super.setPrimaryItem(container, position, object);
}

Upvotes: 1

mmlooloo
mmlooloo

Reputation: 18977

Then , for example if I enter the 1st page, it call the instantiateItem 2 times, the position are 0 and 1 , and it called the form1() and the form2(), which I expect only when I enter that page , it call the function of that page . e.g. At 1st page , run form1(), At 2nd page , run form2(). How to fix that? thanks.

you can not fix that, because of giving better UX to user setOffscreenPageLimit(0); dose not work and the default value is always 1 which means it always preloads your next and previous page.

so after I input the data in those edittext at 2nd tab, and go to the 3rd tab, it does not call form3() again, so the 3rd tab does not display enter data from 2nd tab (The view was preload and instantiate already)

you can save your data in SharedPreferaces and read them in onResume method of tab3. in this way you will get correct data from tab2 and tab1.

Upvotes: 1

Related Questions