0

我想使用Viewpager显示 Whatsapp 显示的图像,当我们单击任何人聊天中的任何照片时,它将打开全屏图像视图,我们可以向左或向右滚动以查看该聊天中的更多媒体项目。

我知道他们可能会使用分页在Viewpager的两端按需加载更多图像,但是如果我们在用户在Viewpager中观看照片时动态更新列表,那么他不会注意到图像的更新数组列表

Whatsapp 处理得非常清楚。

在不让用户知道的情况下动态地向数组列表添加更多数据可以做些什么,我要求在左右两端进行分页,而不仅仅是一侧。

4

1 回答 1

0

我不知道 WhatsApp 是如何工作的,但如果你想拥有一个“无限”滑动 ViewPager,你可以返回一个很大的值getCount()并使用模数来获得正确的图像。

就像是:

public class ImageAdapter extends PagerAdapter {
    List<Image> images;
    
    public ImageAdapter(List<Image> images) {
        this.images = images;
    }

    @Override
    public int getCount() {
        return images.size() * 100;
    }

    @Override
    public Object instantiateItem(ViewGroup container, final int position) {
        Image image = images.get(position % images.size());

        // Instantiate your view
    }
}

当您设置 ViewPager 时,也将当前项目设置为一个较大的值,以便您实际上可以双向滚动

viewPager.setCurrentItem(images.size() * 50)

这可能会对性能产生一些影响,因为必须创建更多视图。

选项 2

另一种选择是添加一个ViewPager.OnPageChangeListener更改哪个项目是活动的项目。您仍然需要在 中返回更大的值getCount(),但它只是列表大小的三倍,因此不会那么剧烈。

这个想法是滚动到“相同”的项目,它会把你带到列表的中间,所以感觉就像你在无限滚动

在适配器中:

// For a list with 2 items, the list will look like:
// 0 1    0 1    0 1

@Override
public int getCount() {
    return images.size() * 3;
}
// Set the first active item to be in the middle
//      Here
//        |
// 0 1    0 1    0 1
viewPager.setCurrentItem(images.size());

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    int currentPos;

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

    @Override
    public void onPageScrollStateChanged(int state) {
        if (state == ViewPager.SCROLL_STATE_IDLE) {
            // Here       Go here    Or here
            //   |          |          |
            // 0 1        0 1        0 1
            if (currentPos == images.size() - 1 || currentPos == adapter.getCount() - 1) {
                // Scrolling with "false" removes the animation and instantly switches 
                // item, so you won't notice the scroll
                viewPager.setCurrentItem(images.size() * 2 - 1, false);
            } else if (currentPos == images.size() * 2 || currentPos == 0) {
                // Or here  Go here    Here
                // |          |          |
                // 0 1        0 1        0 1
                viewPager.setCurrentItem(images.size(), false);
            }
        }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // Not implemented
    }
});

这个解决方案的问题是它不能保证onPageScrollStateChanged会被调用,SCROLL_STATE_IDLE因为你可能会在它到达空闲状态之前滚动到一个新页面,这会导致你滚动过去应该切换的项目。如果您到达结束/开始,它将更改项目,但您会注意到如果滚动速度足够快,您将无法在短时间内滚动。

这些选项都不是完美的,但希望它能让您了解什么是可能的。

于 2020-11-18T09:15:26.243 回答