在进行无限滑动时,viewpager.setCurrentItem()不会更改为已替换的项目

时间:2016-12-07 03:43:39

标签: android android-fragments android-viewpager

我制作无限滑动适配器。我会尽力解释清楚。请帮忙。

我的问题

创建一个可以向左或向右滑动的ViewPager。始终在滑动后的开始和结束时创建新片段。

我的逻辑

为ViewPager创建5个静态片段。

ORDER 0 1 2 3 4 FRAG a b c d e SHOW ITEM at 2

每次滑动(例如左)我将改变这些片段的位置并在末尾添加新的实例片段。更改位置后,我将适配器项目设置回位置中心。

OLD ORDER 0 1 2 3 4 NEW ORDER 1 2 3 4 N FRAG b c d e f NEW SHOW ITEM at 3

右键滑动

OLD ORDER 0 1 2 3 4 NEW ORDER N 0 1 2 3 FRAG n a b c d NEW SHOW ITEM at 1

我只改变片段,总是在位置中心设置显示项目。 我认为我的逻辑将解决无限的滑动。

代码

我会在这里粘贴我的代码,使用9个片段而不是5个。所以位置中心是4.我认为这将有助于滑动更顺畅。

创建列表:

        for (int i = 0; i < 9; i++) {
        Calendar tmpCal = Calendar.getInstance();
        tmpCal.add(calendarVariable, count++);
        list[i] = EachPageTransactionsFragment.newInstance(tmpCal, calendarVariable);
        if (i == 0) cal0 = tmpCal;
        if (i == 8) cal9 = tmpCal;
    }

将列表设置为适配器并将位置设置为居中。

vpgMainAdapter = new ListTransactionViewPagerAdapter(getChildFragmentManager(), getActivity(), list, cal0, cal9);
    vpgMain.setAdapter(vpgMainAdapter);
    vpgMain.setCurrentItem(4);

在那之后,我设置一个听众来听滑动。

vpgMain.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        private int mFocusPageA, mFocusPageB;

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            mFocusPageA = position;
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == ViewPager.SCROLL_STATE_IDLE) {
                if (mFocusPageA != mFocusPageB) {
                    if (mFocusPageA < 5) {
                        vpgMainAdapter.addPage(-1, currentFilterStateForCalendar);
                        vpgMainAdapter.notifyDataSetChanged();
                        vpgMain.setCurrentItem(4);
                        updateTitleByState(-1);
                    } else {
                        vpgMainAdapter.addPage(1, currentFilterStateForCalendar);
                        vpgMainAdapter.notifyDataSetChanged();
                        vpgMain.setCurrentItem(4);
                        updateTitleByState(1);
                    }
                    mFocusPageB = mFocusPageA;
                }
                //
            }
        }
    });

addPage是一个帮我修改列表的函数。因为滑动后,位置会发生变化,所以我将其设置回中心位置。 state -1表示向右滑动,1表示向左滑动。

addPage功能

public void addPage(int i, int calendarVariable){
    if (i == -1){
        for (int j = 8; j > 0; j--){
            list[j] = list[j-1];
        }
        cal0.add(calendarVariable, -1);
        list[0] = EachPageTransactionsFragment.newInstance(cal0, calendarVariable);
    }else if (i == 1){
        for (int j = 0; j < 8; j++){
            list[j] = list[j+1];
        }
        cal9.add(calendarVariable, 1);
        list[8] = EachPageTransactionsFragment.newInstance(cal9, calendarVariable);
    }
}

问题是在我修改列表中的位置项之后,我将viewpager.setCurrentItem(4)设置为原始项目。

前:

之前:[FRAG0] [FRAG1] [FRAG2] [FRAG3] [FRAG4] [FRAG5] [FRAG6] [FRAG7] [FRAG8]

更改列表后:[FRAG1] [FRAG2] [FRAG3] [FRAG4] [FRAG5] [FRAG6] [FRAG7] [FRAG8] [FRAG9]

viewpager.setCurrentItem(4)=&gt; FRAG4仍然显示,而不是FRAG5。请帮忙。

0 个答案:

没有答案