我制作无限滑动适配器。我会尽力解释清楚。请帮忙。
我的问题
创建一个可以向左或向右滑动的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。请帮忙。