到达视图寻呼机末尾时将视图寻呼机移动到第一项

Moving view pager to first item when the end of view pager is reached

以下是我的instantiateItem方法

@Override
    public Object instantiateItem(ViewGroup container, int position) {
        View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false);

        ImageView imageView = (ImageView) itemView.findViewById(R.id.img);
        TextView textView = (TextView) itemView.findViewById(R.id.txt);
        imageView.setImageResource(mResources[position]);
        textView.setText(mCompanies[position]);
        container.addView(itemView);

        return itemView;
    }

我想通过滚动检测用户是否已经到达视图寻呼机的末尾,如果用户已经到达末尾,我想从左到右摇动整个 viewpager。我该怎么做?

你可以为此使用 OnPageChangeListener

pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if(position == lastPosition){
                    pager.setCurrentItem(0, true);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
@Override
public void onPageScrollStateChanged(int state) {

     //mImageResource is image array

    if(state<mImageResources.length)
    {
   //intro_images is viewpager           
   intro_images.setCurrentItem(0,true);
    }

}

一种解决方案是覆盖 viewPager 的触摸侦听器以执行所需的操作。您可以在此视频中看到它是如何工作的 ViewPager Example

我在这里做的是存储 touchDown x 坐标并将其与 touchUp x 坐标进行比较,以确定它是从左到右还是从右到左的移动。因为 x 从左边开始,从 0 开始,向右增加。所以当downX小于upX时,它是从左向右移动,反之亦然。

对于从右到左,我将 viewPager 向前移动,如果它在最后一个位置,则移动到第一个。同样,对于从左到右,我将 viewPager 向后移动,如果它位于第一个位置,则移动到最后一个。

覆盖最后一行中的 TouchListener return 'true'。

viewPager.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    // store the x coordinate of touch down
                    actionDownX = event.getX();
                    break;

                case MotionEvent.ACTION_UP:
                    int currentPosition = viewPager.getCurrentItem();

                    // the x coordinate of action up
                    float actionUpX = event.getX();

                    // Swiped from Left to Right -> Move Backward
                    if (actionDownX < actionUpX) {

                        // Move to Last item 
                        if (currentPosition == 0) {
                            viewPager.setCurrentItem(size - 1, true);
                        }

                        // Move Backward
                        else {
                            int nextPosition = Math.max(0, currentPosition - 1);
                            viewPager.setCurrentItem(nextPosition, true);
                        }
                    }

                    // Swiped from Right to Left -> Move Forward
                    else if (actionDownX > actionUpX) {

                        // Move to First item
                        if (currentPosition == size - 1) {
                            viewPager.setCurrentItem(0, true);
                        }

                        // Move Forward
                        else {
                            int nextPosition = Math.min(size - 1, currentPosition + 1);
                            viewPager.setCurrentItem(nextPosition, true);
                        }
                    }
            }

            // This is important. To override the default behavior, return true
            return true;
        }
    });

注意:请注意,这不是一个完整的解决方案,只是关于如何执行所需操作的一个想法。滑动时,它的行为并不完全像 viewPager(您可以在视频中看到)。所以建议不要只是 copy-paste 这段代码,而应该 expand/improve 鳕鱼并添加所有必要的检查。