kallianas
kallianas

Reputation: 121

viewpager with synchronized listviews in tabs

I have a viewpager with 2 tabs(pages). Both tabs containing a listview with multiple items(rows). I want when I scroll between the tabs the listview in both tabs to be synchronized(display the same rows).

e.g. I am in the 1st tab and currently displaying rows 10-15 of my listview, when I scroll to the 2nd tab I want again to display the items in rows 10-15 of the listview in the 2nd tab.

Is this possible? I cannot find any attribute in viewpager to help me. How can I achieve this effect programmatically??

Upvotes: 3

Views: 847

Answers (1)

kallianas
kallianas

Reputation: 121

Problem solved. In case others need this kind of effect here's how I've done it:

public class myViewPager extends Fragment implements OnPageChangeListener {
    ...         
    ViewPager viewPager;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) 
    {
        ...

        //init viewPager
        ...
        ...

        viewPager.setOnPageChangeListener(this);
        return view;
    }

    @Override
    public void onPageSelected(int position) {
        // get the 2 page(tabs) fragments (I am using FragmentStatePagerAdapter) [*1]
        MyFragmentPagerAdapter a = (MyFragmentPagerAdapter) viewPager.getAdapter();     
        MyFragment selectedFrag = (MyFragment) a.instantiateItem(viewPager, position);      
        MyFragment previousFrag = (MyFragment) a.instantiateItem(viewPager, (position == 0) ? 1 : 0);

        // get 1st visible item position index & item offset value from top  [**2]
        int index = previousFrag.listView.getFirstVisiblePosition();
        View view = previousFrag.listView.getChildAt(0);
        int top = (view == null) ? 0 : view.getTop();
        //set the listView to the synchronized position
        selectedFrag.listView.setSelectionFromTop(index, top);
    }

    ...

    private class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
        public MyFragmentPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Bundle args = new Bundle();
            args.putInt("position", position);
            return Fragment.instantiate(getActivity(), MyFragment.class.getName(), args);
        }
        ...
        ...
    }

    public static class MyFragment extends Fragment {
        ...

        private ListView listView;

        ...
        // CreateView ...
        // init listview ...
        // do other stuff ...
        ...
    }

}

related help:

[*1] here

[**2] here

cheers.. :)

Upvotes: 2

Related Questions