当前位置: 首页 > 知识库问答 >
问题:

无限/动态ViewPager在两个方向

龙逸清
2023-03-14

有一个ViewPager的用例,我从未见过它的实现。

ViewPager或多或少是静态结构。将页面添加到右侧(附加到模型并显示它)并不难,但是,应该有一个好用的解决方案来扩展PagerAdapter(或它的一些子类),这样它就可以双向扩展。

我可以想象适配器的接口是这样的

boolean isEmpty()
boolean hasNext()
boolean hasPrevious()
Object  getNext()
Object  getPrevious()
Object  getItem(int position)

// or if using generics
T       getNext()
T       getPrevious()
T       getItem(int position)

类似于集合html" target="_blank">迭代器,但都是定向的。

其中索引/位置不受0的限制,但可以使用整型的整个范围
实现可能不基于数组(从0到无限)。

我发现了这个“黑客”:动态地向viewpager添加和删除视图
但正如我前面所说的,我试图让它自然工作,而不是保持3,5,。。。项目并强制ViewPager根据某些扭曲的逻辑更改当前位置

目前是否有足够的实施或是否有必要实施
如果答案是一个全新的实现,我愿意悬赏。

共有2个答案

郎建章
2023-03-14

使用负位置值与ViewPager使用的自然顺序相去甚远,根本不是适配器的问题。请在Android SDK的支持包源中查看ViewPager的源代码。例如,这里有一个setMONtItem内部私有实现:

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
    if (mAdapter == null || mAdapter.getCount() <= 0) {
        setScrollingCacheEnabled(false);
        return;
    }
    if (!always && mCurItem == item && mItems.size() != 0) {
        setScrollingCacheEnabled(false);
        return;
    }

    if (item < 0) {
        item = 0;
    } else if (item >= mAdapter.getCount()) {
        item = mAdapter.getCount() - 1;
    }
    final int pageLimit = mOffscreenPageLimit;
    if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
        // We are doing a jump by more than one page.  To avoid
        // glitches, we want to keep all current pages in the view
        // until the scroll ends.
        for (int i=0; i<mItems.size(); i++) {
            mItems.get(i).scrolling = true;
        }
    }
    final boolean dispatchSelected = mCurItem != item;
    populate(item);
    scrollToItem(item, smoothScroll, velocity, dispatchSelected);
}

如您所见,ViewPager显式地假定没有负位置值。

韩弘壮
2023-03-14

这会有帮助吗,

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 1:
            return Fragment1.newInstance();
            case 2:
            return Fragment2.newInstance();
            case 3:
            return Fragment3.newInstance();
        }
    }
}

然后,

mPager。setCurrentItem((int)(整数最大值/2)) //假设mPager是您的ViewPager

 类似资料:
  • 问题内容: 有一个使用-情况我从来没见过漂亮的实现。 是或多或少的静态结构。将Pages添加到右侧(添加到Model并显示它)并不难,但是,应该有一个很好用的解决方案来扩展PagerAdapter(或其某些子类),以便它可以双向扩展。 我可以想象这样的适配器接口 与Collections Iterator相似,但是是双向的。 其中索引/位置不限于0以下,而是可以使用Integer类型的整个范围。

  • 问题内容: 如Google所记录,Gallery类在API级别16中已弃用。不再支持此小部件。其他水平滚动小部件包括支持库中的Horizo​​ntalScrollView和ViewPager。因此,我使用ViewPager作为Gallery类的替代方法。 我的目标是最终实现 带有文本描述 的 无限滚动图像ViewPager 。我使用以下代码实现了具有描述每个图像的文本的图像ViewPager,但是

  • 本文向大家介绍Android ViewPager无限循环实现底部小圆点动态滑动,包括了Android ViewPager无限循环实现底部小圆点动态滑动的使用技巧和注意事项,需要的朋友参考一下 页面拖动到最后一页 再向下滑动回复到 第一页,第一页向前滑动回到 最后一页 同时,底部红色小圆点随着页面的滑动距离比例随时改变位置 布局: 其中red_circle是用shape绘制的红色小圆点 最后的Lin

  • 本文向大家介绍android ViewPager实现自动无限轮播和下方向导圆点,包括了android ViewPager实现自动无限轮播和下方向导圆点的使用技巧和注意事项,需要的朋友参考一下 一、布局 小圆点形状的生成shape.xml文件 使用空心还是实心的把对应的注释去掉就可以了. 轮播的ViewPager和向导圆点的 布局文件XML 二,代码 左右轮播的ViewPager的Adapter 添

  • 本文向大家介绍Android简单实现无限滚动自动滚动的ViewPager,包括了Android简单实现无限滚动自动滚动的ViewPager的使用技巧和注意事项,需要的朋友参考一下 经常我们会在应用中看到一个可以自动滚动,并且无限滚动的一个ViewPager,百度谷歌上面也有很多关于这方面的教程,但是感觉都略显麻烦,而且封装的都不是很彻底。所以试着封装一个比较好用的ViewPager 效果如下: 简

  • 我想禁用刷卡,但仅限于右侧。我在这个答案中找到了一个有效的解决方案。不幸的是,这复制了整个源代码以实现目标。有没有只继承现有类而不复制的方法?