如何在安卓中创建一个圆形的视图翻页器?

4

enter image description here 如何从ViewPager的第一个页面跳转到最后一个页面?即如何使ViewPager循环?如果用户向左滑动,则应跳转到最后一页,如果用户向右滑动,则应跳转到第一页。

Java File 
package com.example.hakimi.firebasemessaging;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.eftimoff.viewpagertransformers.CubeInTransformer;
import com.eftimoff.viewpagertransformers.DefaultTransformer;
import com.eftimoff.viewpagertransformers.DrawFromBackTransformer;
import com.eftimoff.viewpagertransformers.RotateUpTransformer;
import com.eftimoff.viewpagertransformers.StackTransformer;
import com.eftimoff.viewpagertransformers.TabletTransformer;

import java.util.ArrayList;

    public class NewsCardView extends AppCompatActivity {
        private CustomPagerAdapter mCustomPagerAdapter;
        private ViewPager mViewPager;
        private ArrayList<NewsModel> arrayList = MainActivity.mArrayList;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.news_view_activity);



            Bundle bundle = getIntent().getExtras();
            int id = bundle.getInt("id");


            mCustomPagerAdapter = new CustomPagerAdapter(this,arrayList,mViewPager);





            mViewPager = (ViewPager) findViewById(R.id.pager);
            mViewPager.setAdapter(mCustomPagerAdapter);


            mViewPager.setPageTransformer(true, new TabletTransformer());

            mViewPager.setCurrentItem(id);


            mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    if(position==mViewPager.getAdapter().getCount()-1){
                     /*   Intent reg = new
                                Intent(Illustrations.this,Register_Page.class);*/
                     //   startActivity(reg);
                    }

                }

                @Override
                public void onPageScrollStateChanged(int arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                    // TODO Auto-generated method stub

                }


            });

        }


        }


Xml file

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/relativeLayout">


        <android.support.v4.view.ViewPager
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            >
        </android.support.v4.view.ViewPager>

    </RelativeLayout>




Adapter

    class CustomPagerAdapter extends PagerAdapter {
            Context mContext;
            LayoutInflater mLayoutInflater;


        private int[] pageIDsArray;
        private int count;


        ArrayList<NewsModel> news;


    public CustomPagerAdapter(Context context,ArrayList<NewsModel> news,final ViewPager pager) {
        this.news=news;



            mContext = context;
            mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            }

    @Override
    public int getCount() {
            return news.size();
            }

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

    @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.imageView);
          //  imageView.setImageResource(mResources[position]);
        TextView newstitle,newsdes;

        TextView gotosrc;

        newstitle=(TextView) itemView.findViewById(R.id.pagertitle);
        newsdes=(TextView) itemView.findViewById(R.id.pagerdes);

        newsdes.setMovementMethod(new ScrollingMovementMethod());

        gotosrc=(TextView) itemView.findViewById(R.id.tvsrc);


        gotosrc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(mContext,WebViewActivity.class);
                mContext.startActivity(intent);

            }
        });

        newstitle.setText(news.get(position).getNewsTitle());
        newsdes.setText(news.get(position).getNewsData());

        String imgurll=news.get(position).getNewsImgUrl();

        Picasso.with(mContext)
                .load(imgurll)
                .resize(300, 250)
                .centerCrop()
                .into(imageView);

            container.addView(itemView);

            return itemView;
            }

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

你需要返回一个无限(或非常大的)适配器计数,然后在初始化页面时执行以下操作:例如,你有10个项目。因此,当你显示第11个项目(位置将为10)时,你执行 position = position % realCount。你的 realCount 是10,所以你得到 position = 10 % 10 = 0。然后,你像实例化第一个项目一样实例化它。 - Vladyslav Matviienko
请提供您想要的图片,展示您的圆形ViewPager应该是什么样子。 - cpt. Sparrow
我应该在哪里写这个 "position = position % realCount" ? - Pooja Pachchigar
2个回答

1
使用视图A、B、C的示例,按照以下方式添加视图:C、A、B、C、A。然后将当前页面设置为第1页(即视图A)。
您需要使用以下代码检测ViewPager何时停止滚动在页面0或页面4上。如果是这样,请切换到包含相同可视内容但没有动画的相反页面,以便更改是即时的。
以下是检测滚动停止在页面并切换到“相反”页面的代码:
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        public void onPageScrollStateChanged(int state) {
            if (state == ViewPager.SCROLL_STATE_IDLE) {
                if( newPage != lastPage ) {
                    lastPage = newPage;
                    if( newPage == 4 )
                        viewPager.setCurrentItem( 1, false );
                    else if( newPage == 0 )
                        viewPager.setCurrentItem( 3, false );
                 }
            }
        }

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

        }

        public void onPageSelected(int position) {
            newPage = position;
        }
    });

例如,如果用户停止在页面0上滚动,并切换到页面3,两个页面都看起来像“C”。它不完美,并且不能处理用户同时尝试滚动多个页面的情况。但这是一个可行的解决方案。

最后一页和新页面的初始值是什么? - Mohammad Javadian
非常抱歉没有包含那个信息。如果我没记错的话,两者都将设置为1。当整个视图第一次显示时,您需要滚动到正确的起始页,即第1页。 - David Rector

0

请尝试这个。肯定会像您预期的那样工作。

viewPager?.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
      var currentPage : Int = 0
      var mPreviousPosition : Int = 0
      var mIsEndOfCycle = false
      override fun onPageScrollStateChanged(state: Int) {
        val pageCount = viewPager?.adapter?.count
        if (state == ViewPager.SCROLL_STATE_IDLE) {
          if (mPreviousPosition == currentPage && !mIsEndOfCycle) {
            if (currentPage == 0) {
              pageCount?.minus(1)?.let { viewPager?.setCurrentItem(it, false) };
            } else {
              viewPager?.setCurrentItem(0, false);
            }
            mIsEndOfCycle = true;
          } else {
            mIsEndOfCycle = false;
          }
          mPreviousPosition = currentPage;
        }
      }

      override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

      override fun onPageSelected(position: Int) {
        currentPage = position
      }

    })

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