循环垂直视图翻页器

3
viewpager中垂直显示图像,甚至循环显示,例如:A>B>C>D>A,并在单击特定图像时需要在浏览器中打开相关站点。我已经通过这个教程实现了垂直视图页面,并且循环也可以工作,但是在单击图像时,它没有返回正确的位置,这是因为 getCount(),我在on instantiateItem中每次都要增加它。如果我不这样做,它就会停止循环。需要在单击特定图像时获取正确的位置,请查看逻辑并为我提供建议。适配器
public class FullScreenImageAdapter extends com.xxxxxx.util.PagerAdapter {

    private Activity _activity;
    private ArrayList<String> _imagePaths;
    private LayoutInflater inflater;
    private int mFakeCount = 0,newPosition;

    // constructor
    public FullScreenImageAdapter(Activity activity, ArrayList<String> imagePaths) {
        this._activity = activity;
        this._imagePaths = imagePaths;
        mFakeCount = _imagePaths.size()+1;

    }

    @Override
    public int getCount() {
        return this.mFakeCount;
//      return this._imagePaths.size();
    }

    public int getNewPosition(){
        return newPosition;
    }


    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((RelativeLayout) object);
    }



    // image lenght =6
    //
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView imgDisplay;

             if (position >= _imagePaths.size()-1) { 
                  newPosition = position%_imagePaths.size();
                 Log.d("####", "new position="+newPosition);
                    position = newPosition;
                    mFakeCount++;
             }

             Log.d("####", "default position="+position);

        inflater = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container,false);
        imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgDisplay);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        Bitmap bitmap = BitmapFactory.decodeFile(_imagePaths.get(position));
        imgDisplay.setImageBitmap(bitmap);



        ((VerticalViewPager) container).addView(viewLayout);
        viewLayout.setTag(_imagePaths.get(position));

        return viewLayout;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((VerticalViewPager) container).removeView((RelativeLayout) object);

    }



}

OnPageChangeListener

_viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {

                browser_url = LockScreen.db.getURL("browser_url",_viewPager.getCurrentItem() + 1); //_viewPager.getCurrentItem() return wrong position.
                Log.i("browser_url dynamic", browser_url);
            }

            @Override
            public void onPageScrolled(int position, float positionOffset,
                    int positionOffsetPixels) 
            {


            }

            @Override
            public void onPageScrollStateChanged(int position) {
                Log.v("onPageScrollStateChanged", String.valueOf(position));

            }
        });
3个回答

1

垂直滚动?也许ListView是更好的选择。

试试this,我认为它可能会有帮助。


这对我的情况没有帮助。 - RobinHood

0
将此代码放置在 onpageselected 方法中:
if (position < ImagepathList.size()) {
                   newPos = position;
                } else {
                for (int j = 0; j < ImagepathList.size(); j++) {
                    if (position % ImagepathList.size() == j) {
                        newPos = j;
                    }
                }

你将获得正确的位置。


1
这个可以运行,但远非理想的解决方案。整个 ViewPager 应该重新设计,只保留计数 + 2 个项目!如果用户滚动很多次,你的应用程序将崩溃,因为 ViewPager 中有太多的项目。 - Leandros

0

这个解决方案听起来很简单,但需要一些实现工作。

你目前总是在ViewPager 中增加项目数量,虽然这在某种程度上是可行的,但并不是一个好的解决方案,而是一个黑客方法。
当你即将到达结尾时,必须将位置设置回起始位置。为此,你需要在开头和结尾都有一个缓冲区。
ViewPager.OnPageChangeListeneronPageScrollStateChanged(int state)非常有用(且必需)。

现在,因为你不再增加数量,所以可以轻松地获得正确的位置。


当用户向上滑动时会发生什么? - RobinHood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接