【问题标题】:viewpager with synchronized listviews in tabs在选项卡中具有同步列表视图的 viewpager
【发布时间】:2013-09-07 19:02:31
【问题描述】:

我有一个带有 2 个标签(页面)的 viewpager。两个选项卡都包含一个包含多个项目(行)的列表视图。我希望当我在选项卡之间滚动时,两个选项卡中的列表视图要同步(显示相同的行)。

例如 我在第一个选项卡中,当前显示列表视图的第 10-15 行,当我滚动到第二个选项卡时,我想再次在第二个选项卡中显示列表视图的第 10-15 行中的项目。

这可能吗?我在 viewpager 中找不到任何属性来帮助我。如何以编程方式实现此效果?

【问题讨论】:

    标签: android android-listview android-fragments scroll android-viewpager


    【解决方案1】:

    问题解决了。 如果其他人需要这种效果,我就是这样做的:

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

    相关帮助:

    [*1]here

    [**2]here

    干杯.. :)

    【讨论】:

    • 此实现的 UX 不是最佳的,因为直到您滚动到实际页面的大约 90% 时才会调用 onPageSelected()。这仍然会在其原始位置显示列表,然后突然它会弹出到位。更优雅的解决方案是使用 onPageScrolled()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多