Android:双向无止境Viewpager的实现 我想要的是:
我一直在尝试在Android中实现双向无休止的viewpager,从左到右&从右到左 我所做的: 我已经实现了无休止的viewpager适配器,它可以从右向左工作,我已经通过Android:双向无止境Viewpager的实现 我想要的是:,android,android-viewpager,adapter,infinite-loop,two-way,Android,Android Viewpager,Adapter,Infinite Loop,Two Way,我一直在尝试在Android中实现双向无休止的viewpager,从左到右&从右到左 我所做的: 我已经实现了无休止的viewpager适配器,它可以从右向左工作,我已经通过viewpager.setCurrentItem(Integer.MAX_值/2)设置了当前项的位置 参考: 如果你能帮忙,我将不胜感激 尝试检查下面的FragmentPagerAdapter以获取无休止的viewpager适配器: public static class MyAdapter extends Fragmen
viewpager.setCurrentItem(Integer.MAX_值/2)设置了当前项的位置代码>
参考:
如果你能帮忙,我将不胜感激 尝试检查下面的FragmentPagerAdapter
以获取无休止的viewpager适配器:
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Fragment getItem(int position) {
return getFragmentBasedOnPosition(position);
}
private Fragment getFragmentBasedOnPosition(int position) {
int fragmentPos = position % 3; // Assuming you have 3 fragments
switch(fragmentPos) {
case 0:
return Fragment1.newInstance();
case 1:
return Fragment2.newInstance();
case 2:
return Fragment3.newInstance();
}
}
}
我找到了解决办法
我希望它能对您有所帮助。建议的解决方案是正确的,但要获得结果,您需要将viewpager的初始值设置为Integer.MAX_value/2
无论如何,我并不喜欢这个解决方案,将getCount设置为返回Integer.MAX_值会对应用程序性能产生巨大影响
为了避免此问题,我使用以下方法找到了解决方案:
onPageScrollStateChanged侦听器
我只需重新排列片段列表,更新viewPager并在没有动画的情况下移动到新页面,结果是在两个方向上都有一个无休止的循环:
mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
{
Boolean first = false;
Boolean last = false;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{}
@Override
public void onPageSelected(int position)
{
if (position == 0)
{
first = true;
last = false;
}
else if (position == mainFragmentList.size() -1)
{
first = false;
last = true;
}
else
{
first = false;
last = false;
}
}
@Override
public void onPageScrollStateChanged(int state)
{
if (first && state == ViewPager.SCROLL_STATE_IDLE)
{
// Jump without animation
Fragment fragment = mainFragmentList.get(mainFragmentList.size() -1);
mainFragmentList.remove(mainFragmentList.size() -1 );
mainFragmentList.add(0,fragment);
mainPagerAdapter.setData(mainFragmentList);
mainPagerAdapter.notifyDataSetChanged();
Log.e(TAG,mainFragmentList.toString());
mainViewPager.setCurrentItem(1,false);
}
if(last && state == ViewPager.SCROLL_STATE_IDLE)
{
// Jump without animation
Fragment fragment = mainFragmentList.get(0);
mainFragmentList.remove(0);
mainFragmentList.add(fragment);
mainPagerAdapter.setData(mainFragmentList);
mainPagerAdapter.notifyDataSetChanged();
Log.e(TAG,mainFragmentList.toString());
mainViewPager.setCurrentItem(mainFragmentList.size()-2,false);
}
}
});
这就是这里发生的事情:
在这个例子中,我们有4个片段A-B-C-D
如果用户在片段A上(第一个),新列表将变成:D-A-B-C
[取下最后一个并按第一个]
我更新ViewPager并再次移动(无动画)以分割so索引1。
现在用户可以继续向左滚动并找到片段D
最后一个片段也是这样:
从A-B-C-D开始
如果用户在片段D(last)上,新列表将变成:B-C-D-A
[取下第一个并按最后一个]
我更新了ViewPager并再次移动(不带动画)到片段D,以便索引mainFragmentList.size()-2。
现在用户可以继续向右滚动并找到片段A
记住实现FragmentStatePagerAdapter而不是FragmentPagerAdapter我已经制定了自己的解决方案。我创建了一个ViewPager,它支持无限循环效果、智能自动滚动、与任何指示器兼容且易于使用。它特别使用它作为一个简单的项目页面应用程序的横幅
我的自定义ViewPager可以:
- 即插即用,易于使用
- 无限循环项
- 自动滚动项目,允许配置,活动/片段恢复/暂停时自动恢复/暂停
- 如果只有1项,则不会滚动或循环
- 兼容多种指标
Github链接:
希望有帮助 为ViewPager2
实现这一点的一个简单方法是使用3个基本思想:
将数据模型集合的第一项和最后一项分别添加到同一集合的末尾和开头。例如,listOf(1,2,3,4,5)
应该变成listOf(5,1,2,3,4,5,1)
设置寻呼机时,请将其设置为从索引1开始
当用户滚动到索引0时,让寻呼机立即滚动到倒数第二个索引。当用户滚动到最后一个索引时,让寻呼机立即滚动到索引1
执行此操作的一些示例代码如下所示:
一,
警告:此代码不协调任何表格布局
或空数据模型集合。请尝试使用此库,感谢您的支持,但正如我所说,我需要双向适配器,这意味着如果我位于第0个位置,并从右向左滑动,则应将0移动到viewpager的最后一项,我已经通过实现了我的目标,我设置了当前位置Integer.MAX_值/2,但仍在寻找类似playstore应用程序的东西。@HirenPatel这实际上应该可以工作,但他忘了说viewPager应该从中间开始,这样就不会让你这么容易进入最右边的边缘。如果我不知道Viewpagerniceee上添加的片段数怎么办。工作得很有魅力:)
private fun <T> List<T>.prepareForTwoWayPaging(): List<T> {
val first = first()
val last = last()
return toMutableList().apply {
add(0, last)
add(first)
}
}
pager.setCurrentItem(1, false)
pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
// We're only interested when the pager offset is exactly centered. This
// will help create a convincing illusion of two-way paging.
if (positionOffsetPixels != 0) {
return
}
when (position) {
0 -> pager.setCurrentItem(adapter.itemCount - 2, false)
adapter.itemCount - 1 -> pager.setCurrentItem(1, false)
}
}
})