ViewPager รูปภาพเลื่อนไม่สิ้นสุด

ตามที่ Google บันทึกไว้ คลาสแกลเลอรีเลิกใช้แล้วใน API ระดับ 16 วิดเจ็ตนี้ไม่ได้รับการสนับสนุนอีกต่อไป วิดเจ็ตการเลื่อนแนวนอนอื่น ๆ ได้แก่ HorizonScrollView และ ViewPager จากไลบรารีสนับสนุน ดังนั้นฉันจึงใช้ ViewPager เป็นทางเลือกแทนคลาส Gallery

เป้าหมายของฉันในการบรรลุ ViewPager รูปภาพที่เลื่อนได้ไม่จำกัดพร้อมคำอธิบายข้อความ ในที่สุด ฉันใช้โค้ดด้านล่างเพื่อให้ได้ ViewPager รูปภาพพร้อมข้อความอธิบายแต่ละรูปภาพ แต่ ฉันจะใช้ Infinite Scrolling กับ ViewPager ได้อย่างไร

ฉันไม่เคยทำงานกับ ViewPager มาก่อน ดังนั้นโปรดพยายามระบุโค้ดโดยละเอียดหากเป็นไปได้

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical">
  <android.support.v4.view.ViewPager 
       android:id="@+id/myimagepager" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" /> 
</LinearLayout>

custom_pager.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
   android:layout_width="match_parent" 
   android:layout_height="match_parent" 
   android:orientation="vertical"  
   android:gravity="center_horizontal">
   <ImageView 
       android:id="@+id/myimage" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_margin="5dp" 
       android:layout_weight="2" /> 
    <TextView 
       android:id="@+id/image_text" 
       android:layout_width="fill_parent" 
       android:layout_height="0dp"   
       android:layout_weight="1"/>

</LinearLayout>

เพจรูปภาพ:

public class ImagePager extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImagePagerAdapter adapter = new ImagePagerAdapter(this, imageArra, stringArray );
        ViewPager myPager = (ViewPager) findViewById(R.id.myimagepager);
        myPager.setAdapter(adapter);
        myPager.setCurrentItem(0);
    }

    private int imageArra[] = { R.drawable.a, R.drawable.b,R.drawable.c, 
                                 R.drawable.d,R.drawable.e,R.drawable.f,
                                 R.drawable.g, R.drawable.h, R.drawable.i};

    private String[] stringArray = new String[] { "Image a", "Image b","Image c"
                                                   "Image d","Image e","Image f", 
                                                   "Image g","Image h","Image i"};


}

ImagePagerAdapter:

public class ImagePagerAdapter extends PagerAdapter {

    Activity activity;
    int imageArray[];
    String[] stringArray;

    public ImagePagerAdapter(Activity act, int[] imgArra, String[] stringArra) {
        imageArray = imgArra;
        activity = act;
        stringArray = stringArra;
    }

    public int getCount() {
        return imageArray.length;
    }

    public Object instantiateItem(View collection, int position) {
        LayoutInflater inflater = (LayoutInflater)collection.getContext
                          ().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.custom_pager, null);   

        ImageView im=(ImageView) layout.findViewById(R.id.myimage);             
        im.setImageResource(imageArray[position]);

        TextView txt=(TextView) layout.findViewById(R.id.image_text);
        txt.setText(stringArray[position]);

        ((ViewPager) collection).addView(layout, 0);
          return layout;   
    }

    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager) arg0).removeView((View) arg2);
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == ((View) arg1);
    }

    @Override
    public Parcelable saveState() {
        return null; 
    }


}

person Android Stack    schedule 02.12.2012    source แหล่งที่มา
comment
คลาสแกลเลอรีเลิกใช้แล้ว .. หลังจาก googled และค้นหามาก ฉันลงท้ายด้วย ViewPager ฮะ ฉันใช้เวลาเพียงไม่กี่วินาทีในการพิมพ์ 'gallery abdroid' (ใช่ฉันสะกดผิด) ลงใน Google เพื่อไปที่เอกสารสำหรับ Gallery. สถานะ 3 ประโยคแรก.. คลาสนี้เลิกใช้แล้วใน API ระดับ 16 วิดเจ็ตนี้ไม่ได้รับการสนับสนุนอีกต่อไป วิดเจ็ตการเลื่อนแนวนอนอื่นๆ ได้แก่ HorizontalScrollView และ ViewPager จากไลบรารีการสนับสนุน เคล็ดลับสำหรับอนาคต ก่อนอื่นให้อ่านเอกสาร ;)   -  person Andrew Thompson    schedule 02.12.2012
comment
@Andrew Thompson โพสต์ที่รักของฉันอัปเดตแล้ว และฉันเห็นเอกสารนั้นจาก Google แล้ว มันเป็นเพียงการให้เหตุผลว่าทำไมฉันถึงเปลี่ยนมาใช้ viewpager ขอบคุณ   -  person Android Stack    schedule 02.12.2012


คำตอบ (7)


ฉันมีปัญหาเดียวกัน แต่ฉันสามารถหาวิธีแก้ไขได้ it - สามารถดูโค้ดได้ที่ github

หากคุณคัดลอกคลาส InfiniteViewPager และ InfinitePagerAdapter ในโครงการของคุณ คุณสามารถเลื่อนได้ไม่จำกัด (แบบรวม) ด้วยการเปลี่ยนแปลงเล็กๆ น้อยๆ

ในกิจกรรมของคุณ ให้ล้อม PagerAdapter ของคุณด้วย InfinitePagerAdapter:

PagerAdapter adapter = new InfinitePagerAdapter(new ImagePagerAdapter(this, imageArra, stringArray));

เปลี่ยน ViewPager ใน XML กิจกรรมให้เป็น InfiniteViewPager:

<com.antonyt.infiniteviewpager.InfiniteViewPager 
       android:id="@+id/myimagepager" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" />

คุณสามารถเปลี่ยนชื่อคลาสเป็นสิ่งที่คุณต้องการได้ รหัสนี้จะใช้งานได้ถ้าคุณมีอย่างน้อยสามหน้า (คุณมีเก้าหน้าในโค้ดตัวอย่างของคุณ ดังนั้นมันจะทำงานได้ดี)

person antonyt    schedule 09.12.2012
comment
มันใช้งานได้ดี แต่ฉันได้โปรดมีคำถาม ตอนนี้ฉันมี 4 คลาสในโปรเจ็กต์ของฉันซึ่งก็คือ :1-ImagePager,2-ImagePagerAdapter,3-InfinitePagerAdapter,4-InfiniteViewPager.java เราสามารถรวมมันเข้าด้วยกันเป็นคลาสเดียวหรือสองคลาสได้ไหม เพจเจอร์รูปภาพที่ไม่มีที่สิ้นสุดนี้จะเป็นส่วนหนึ่งของโปรเจ็กต์ใหญ่หรือเราต้องเก็บไว้เพราะมันประกอบด้วย 4 คลาส และจะส่งผลต่อประสิทธิภาพหรือไม่ ขอบคุณ - person Android Stack; 10.12.2012
comment
ฉันไม่คิดว่าคุณจะพบความแตกต่างด้านประสิทธิภาพที่เห็นได้ชัดเจนจากการใช้ 4 คลาสกับ 2 คลาส จะดีกว่าถ้าแยกพวกมันออกจากกัน เนื่องจากคุณสามารถเพิ่มลักษณะการเลื่อนแบบไม่มีที่สิ้นสุดให้กับ PagerAdapter/ViewPager ใดๆ ที่คุณเขียนในภายหลัง - การรวมพวกมันทั้งหมดเข้าด้วยกันจะทำให้ไม่สามารถใช้ซ้ำได้อย่างง่ายดายในบริบทอื่น - person antonyt; 10.12.2012
comment
ตกลง ฉันเข้าใจแล้ว อีกประการหนึ่ง: 1- ทำไมเราไม่มีอะแดปเตอร์เพียงตัวเดียวในโปรเจ็กต์นี้ เพราะคุณพูดถึง :((ห่อ PagerAdapter ของคุณด้วย InfinitePagerAdapter)) ทำไมเราไม่เขียนอะแดปเตอร์ตัวเดียวและเรียกมันว่า: InfinitePagerAdapter หรือตรงนั้น เป็นพฤติกรรมเฉพาะที่ต้องได้รับจากกระบวนการห่อ 2- คุณพูดถึงในโค้ดของคุณ: อนุญาตให้วนกลับ 100 รอบตั้งแต่เริ่มต้น ควรจะเพียงพอที่จะสร้างภาพลวงตาของความไม่มีที่สิ้นสุด นั่นหมายความว่าฉันมีรอบใหม่ 100 รอบทุกครั้งที่ฉันเปิดแอปพลิเคชันของฉัน คุณช่วยกรุณาชี้แจงสองประเด็นนี้ด้วย ขอบคุณ - person Android Stack; 10.12.2012
comment
ImagePagerAdapter ของคุณมีหน้าที่เฉพาะ โดยทำหน้าที่จัดเค้าโครงสำหรับแต่ละหน้าและไม่ต้องกังวลเกี่ยวกับสิ่งอื่นใด InfinitePagerAdapter ยังกังวลเกี่ยวกับการเลื่อนแบบไม่มีที่สิ้นสุดเท่านั้น โดยไม่เกี่ยวกับหน้าใดหน้าหนึ่งที่กำลังแสดง - โดยจะไม่โหลดมุมมองใดๆ ของตัวเอง มันเป็นเพียงตัวเลือกการออกแบบที่จะแยกสิ่งเหล่านี้ออกจากกันเช่นนี้ - ตัวเลือกที่ช่วยให้ InfinitePagerAdapter ทำงานร่วมกับ PagerAdapter ใดๆ ที่คุณเขียนได้ 100 รอบนั้นมีไว้สำหรับอายุการใช้งานของ View ซึ่งโดยทั่วไปแล้วจะเหมือนกับอายุการใช้งานของกิจกรรม การสร้างกิจกรรมใหม่จะทำให้กิจกรรมถูกรีเซ็ต - person antonyt; 10.12.2012
comment
มันส่งคืนตำแหน่งที่เลือกที่ถูกต้องบนคลิกของ imageview หรือไม่? - person RobinHood; 16.12.2013
comment
จะเพิ่มตัวบ่งชี้หน้าได้อย่างไร? - person Aditya; 20.02.2019

ฉันคิดว่าวิธีแก้ปัญหาของฉันง่ายกว่า

ให้ความสนใจกับโครงสร้างอาร์เรย์รูปภาพของฉัน:

Item 0          => last image

Item count()-1  => first image

เคล็ดลับอยู่ที่ onPageScrollStateChanged:

เมื่อผู้ใช้เลื่อนไปที่รายการสุดท้าย -> เพจเจอร์จะกระโดดโดยไม่มีภาพเคลื่อนไหวไปที่ภาพแรก (ตำแหน่ง = 1)

เมื่อผู้ใช้เลื่อนไปที่รายการแรก -> เพจเจอร์จะกระโดดโดยไม่มีภาพเคลื่อนไหวไปยังรูปภาพสุดท้าย (ตำแหน่ง = นับ - 2)

public class InfiniteScrollingActivity extends ActionBarActivity {

    private ViewPager     pager;
    private MyAdapter     adapter;
    int[] promoImageIds = new int[]{R.drawable.cover6, R.drawable.cover1, R.drawable.cover2, R.drawable.cover3, R.drawable.cover4, R.drawable.cover5, R.drawable.cover6, R.drawable.cover1 };

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

        adapter = new MyAdapter(getSupportFragmentManager(), promoImageIds);
        pager = (ViewPager)findViewById(R.id.pager);
        pager.setAdapter(adapter);
        pager.setCurrentItem( 1 );
        pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int index) {
                Log.v( "onPageSelected", String.valueOf( index ) );
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // Log.v("onPageScrolled", "");
            }

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

                if (state ==ViewPager.SCROLL_STATE_IDLE) {
                    int index = pager.getCurrentItem();
                    if ( index == 0 )
                        pager.setCurrentItem( adapter.getCount() - 2, false );
                    else if ( index == adapter.getCount() - 1 )
                        pager.setCurrentItem( 1 , false);
                }
            }
        });
    }


    public static class MyAdapter extends FragmentPagerAdapter {

        int[] promoImageIds;

        public MyAdapter(FragmentManager fm, int[] promoImageIds){
            super(fm);
            this.promoImageIds = promoImageIds;
        }

        @Override
        public int getCount(){
            return promoImageIds.length;
        }

        @Override
        public Fragment getItem(int position) {

            return PromoFragment.newInstance( promoImageIds[position] );
        }
    }

    public static class PromoFragment extends Fragment
    {
        int imageID;


        static PromoFragment newInstance( int imageID)
        {
            PromoFragment f = new PromoFragment();

            // Supply num input as an argument.
            Bundle args = new Bundle();
            args.putInt( "imageID", imageID );
            f.setArguments(args);

            return f;
        }

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            imageID = getArguments() != null ? getArguments().getInt( "imageID" ) : null;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState)
        {
            ImageView v = (ImageView) inflater.inflate(R.layout.fragment_image, container, false);
            v.setImageResource( imageID );
            return v;
        }
    }
}
person Shlomi Hasin    schedule 02.09.2014
comment
ส่วนที่ยุ่งยากคือการอ่านอาร์เรย์ promoImageIds ของคุณอย่างละเอียด และโปรดทราบว่าคุณได้ทำซ้ำองค์ประกอบสุดท้ายและองค์ประกอบแรกในอาร์เรย์ของคุณ ใช้งานง่ายและใช้งานได้อย่างมีเสน่ห์! - person dianakarenms; 30.05.2017
comment
วิธีนี้ใช้ได้ผลดีที่สุดสำหรับฉัน โดยไม่มีปัญหาด้านประสิทธิภาพเหมือนกับวิธี Int32.MaxValue Count - person Justin; 09.11.2018
comment
ทำงานเหมือนมีเสน่ห์ แต่ตัวบ่งชี้ด้านล่างทำงานไม่ถูกต้องในรายการ ฉันมีข้อมูล 3 ขนาด การเลื่อนไม่มีที่สิ้นสุด แต่ตัวบ่งชี้แสดง 2 คุณช่วยแก้ปัญหานี้ได้ไหม - person MustafaShaikh; 16.09.2019

ฉันพบวิธีทำเคล็ดลับง่ายๆ แล้ว หวังว่ามันจะช่วยคุณได้

import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;

public class ImagePager extends Activity {
    String[] stringArray;
    int[] imageArra;
    ViewPager myPager;
    Boolean isScrooled = false;
    // use this array yo understand swipe left or right ?
    ArrayList<Float> pos = new ArrayList<Float>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

            // put  empty view at the beginnig and to end

        imageArra = new int[] { 0, R.drawable.ic_launcher,
                R.drawable.ic_launcher, R.drawable.ic_launcher,
                R.drawable.ic_launcher, R.drawable.ic_launcher,
                R.drawable.ic_launcher, R.drawable.ic_launcher,
                R.drawable.ic_launcher, R.drawable.ic_launcher, 0 };

           // put  empty string at the beginnig and to end

        stringArray = new String[] { "", "Image a", "Image b", "Image c",
                "Image d", "Image e", "Image f", "Image g", "Image h",
                "Image i", "" };

        ImagePagerAdapter adapter = new ImagePagerAdapter(this, imageArra,
                stringArray);
        myPager = (ViewPager) findViewById(R.id.myimagepager);
        myPager.setAdapter(adapter);
        myPager.setCurrentItem(1);

        myPager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                Log.v("onPageSelected", String.valueOf(arg0));
                pos.clear();
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                try {
                            // while scrolling i add ever pos to array
                    pos.add(arg1);
                                    // if pos.get(0) > pos.get(pos.size() - 1) 
                    // <----- swipe <-----  
                                    // we should check isScroll because setCurrent item is not a croll ? 

                    if (pos.size() > 0)
                        if (arg0 == imageArra.length - 1
                                & pos.get(0) > pos.get(pos.size() - 1)
                                & isScrooled == true) {
                            try {
                                isScrooled = false;
                                myPager.setCurrentItem(1, false);
                            } catch (Exception e) {
                                Log.v("hata",
                                        "<----- swipe <-----  " + e.toString());
                            }

                        }
                        // ----> swipe ---->
                        else if (arg0 == 0
                                & pos.get(0) < pos.get(pos.size() - 1)
                                & isScrooled == true) {
                            try {
                                isScrooled = false;
                                myPager.setCurrentItem(imageArra.length - 1,
                                        false);
                            } catch (Exception e) {
                                Log.v("hata",
                                        "----> swipe ---->  " + e.toString());
                            }

                        } else if (arg0 == 0 & pos.size() == 1
                                & isScrooled == true) {
                            try {
                                isScrooled = false;
                                myPager.setCurrentItem(imageArra.length - 1,
                                        false);
                            } catch (Exception e) {
                                Log.v("hata",
                                        "----> swipe ---->  " + e.toString());
                            }

                        }

                } catch (Exception e) {
                    Log.v("hata", e.toString());
                }

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                Log.v("onPageScrollStateChanged", String.valueOf(arg0));
                            // set is scrolling
                isScrooled = true;
            }
        });

    }

}

[แก้ไข 1]

import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;

public class ImagePager extends Activity {
    String[] stringArray;
    int[] imageArra;
    ViewPager myPager;
    int scrollState;
    Boolean isFirstVisitEnd= true,isFirstVisitBegin = true;
    ArrayList<Integer> pos = new ArrayList<Integer>();


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageArra = new int[] { 0,R.drawable.ic_launcher,
                R.drawable.ic_launcher, R.drawable.ic_launcher,
                R.drawable.ic_launcher, R.drawable.ic_launcher,
                R.drawable.ic_launcher, R.drawable.ic_launcher,
                R.drawable.ic_launcher, R.drawable.ic_launcher, 0 };

        stringArray = new String[] {"","Image a", "Image b", "Image c",
                "Image d", "Image e", "Image f", "Image g", "Image h",
                "Image i", "" };

        ImagePagerAdapter adapter = new ImagePagerAdapter(this, imageArra,
                stringArray);
        myPager = (ViewPager) findViewById(R.id.myimagepager);
        myPager.setAdapter(adapter);
        myPager.setCurrentItem(1);

        myPager.setOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageSelected(int arg0) {
                Log.v("onPageSelected", String.valueOf(arg0));
                pos.clear();
                if (arg0 == imageArra.length - 1)
                    isFirstVisitEnd = false;
                else
                    isFirstVisitEnd = true;


                if (arg0 == 0)
                    isFirstVisitBegin = false;
                else
                    isFirstVisitBegin = true;
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {                                
                try { 
                    pos.add(Integer.valueOf(arg2));

                    if (pos.size() > 0) {
                        //Log.v("onPageScrolled_arg2","arg0  : "+String.valueOf(arg0)+"   ilk : "+pos.get(0).toString()+"    son : " +pos.get(pos.size() - 1).toString()+ "   "+ String.valueOf(pos.get(0)-(pos.get(pos.size() - 1)))+"    isFirstVisitEnd: "+String.valueOf(isFirstVisitEnd.booleanValue()) );

                        // <----- swipe <-----
                        if (arg0 == imageArra.length - 2& (pos.get(pos.size() - 1) -pos.get(0)  < 100)& scrollState == 2 & isFirstVisitEnd == false) {                          
                            myPager.setCurrentItem(1, false);
                        }

                        //Log.v("onPageScrolled_arg2","arg0  : "+String.valueOf(arg0)+"   ilk : "+pos.get(0).toString()+"    son : " +pos.get(pos.size() - 1).toString()+ "   "+ String.valueOf(pos.get(0)-(pos.get(pos.size() - 1)))+"    isFirstVisitbegin: "+String.valueOf(isFirstVisitBegin.booleanValue()) );
                        if (arg0 == 0 & (pos.get(pos.size() - 1) -pos.get(0)  > -100)& scrollState == 2 & isFirstVisitBegin == false) {                         
                            myPager.setCurrentItem(imageArra.length - 2, false);
                        }       
                    }

                } catch (Exception e) {
                    Log.v("hata", e.toString());
                }

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                Log.v("onPageScrollStateChanged", String.valueOf(arg0));
                scrollState =arg0;
            }
        });
    }
}
person Talha    schedule 08.12.2012
comment
ตกลง มันเลื่อนอย่างต่อเนื่อง แต่ยังคงมีสิ่งหนึ่งที่มุมมองที่ว่างเปล่ายังคงปรากฏเมื่อถึงมุมมองสุดท้าย และต้องการดำเนินการต่อเป็นอันดับแรกว่าเราเอาชนะสิ่งนี้ได้อย่างไร ขอบคุณ - person Android Stack; 09.12.2012
comment
สวัสดี เป็นการยากที่จะเข้าใจค่าที่แน่นอนของตำแหน่งเพจเจอร์ แต่ฉันเปลี่ยนโค้ดแล้ว และฉันคิดว่าตอนนี้ดีขึ้นแล้ว โปรดดูที่การแก้ไข และหากคุณมีความคิดที่จะปรับปรุงคุณภาพ โปรดแบ่งปันกับฉัน ([email protected]) ฉันกำลังวางแผนที่จะพัฒนาเพจเจอร์แบบไม่มีที่สิ้นสุดและนำไปใช้กับ GitHub - person Talha; 09.12.2012
comment
รหัสแรกดีกว่ารหัสที่สอง แต่ยังคงแสดงมุมมองว่างทั้งคู่ อันที่สองเมื่อเลื่อนเพื่อเข้าถึงมุมมองที่ว่างเปล่าอย่างช้าๆ มันซ้อนกัน คุณต้องเลื่อนกลับไปหนึ่งมุมมอง จากนั้นไปข้างหน้าอีกครั้งเพื่อเลื่อนต่อไป ขอบคุณ - person Android Stack; 10.12.2012

ฉันพบวิธีแก้ปัญหาอื่นโดยอิงจาก Shlomi Hasin และ antonyt คำตอบ โดยไม่มีการแก้ไขคอลเล็กชัน

ViewPager yourPager;
PagerAdapter yourAdapter;
//....
EndlessPagerAdapter endlessPagerAdapter = new EndlessPagerAdapter(yourAdapter, yourPager);
yourPager.setAdapter(endlessPagerAdapter);
yourPager.setCurrentItem(1);//for correct first page

ชั้นเรียนเต็ม:

public class EndlessPagerAdapter extends PagerAdapter {

private PagerAdapter adapter;

public EndlessPagerAdapter(PagerAdapter adapter, ViewPager viewPager) {
    this.adapter = adapter;
    viewPager.addOnPageChangeListener(new SwapPageListener(viewPager));
}

@Override
public int getCount() {
    return adapter.getCount() + 2;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    if (adapter.getCount() < 2) {
        adapter.instantiateItem(container, position);
    }

    int newPosition;
    if (position == 0) {
        newPosition = adapter.getCount() - 1;
    } else if (position >= getCount() - 1) {
        newPosition = 0;
    } else {
        newPosition = position - 1;
    }
    return adapter.instantiateItem(container, newPosition);
}

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

@Override
public void finishUpdate(ViewGroup container) {
    adapter.finishUpdate(container);
}

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

@Override
public void restoreState(Parcelable bundle, ClassLoader classLoader) {
    adapter.restoreState(bundle, classLoader);
}

@Override
public Parcelable saveState() {
    return adapter.saveState();
}

@Override
public void startUpdate(ViewGroup container) {
    adapter.startUpdate(container);
}

@Override
public CharSequence getPageTitle(int position) {
    return adapter.getPageTitle(position);
}

@Override
public float getPageWidth(int position) {
    return adapter.getPageWidth(position);
}

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    adapter.setPrimaryItem(container, position, object);
}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
    adapter.unregisterDataSetObserver(observer);
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {
    adapter.registerDataSetObserver(observer);
}

@Override
public void notifyDataSetChanged() {
    adapter.notifyDataSetChanged();
}

@Override
public int getItemPosition(Object object) {
    return adapter.getItemPosition(object);
}

private class SwapPageListener implements ViewPager.OnPageChangeListener {

    private ViewPager viewPager;

    SwapPageListener(ViewPager viewPager) {
        this.viewPager = viewPager;
    }

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

    }

    @Override
    public void onPageSelected(int position) {

    }

    @Override
    public void onPageScrollStateChanged(int state) {
        if (state == ViewPager.SCROLL_STATE_IDLE) {
            PagerAdapter pagerAdapter = viewPager.getAdapter();
            if (pagerAdapter != null) {
                int itemCount = pagerAdapter.getCount();
                if (itemCount < 2) {
                    return;
                }
                int index = viewPager.getCurrentItem();
                if (index == 0 ) {
                    viewPager.setCurrentItem(itemCount - 2, false);
                } else if (index == itemCount - 1) {
                    viewPager.setCurrentItem(1, false);
                }
            }
        }
    }
}}

วิธีการทำงาน:

เรามีของสะสมอยู่บ้าง

คอลเลกชัน

จากนั้นเพิ่มรายการเพิ่มเติมอีกสองรายการลงไป

ขนาดใหม่

แสดงองค์ประกอบแรกในตำแหน่งสุดท้ายและองค์ประกอบสุดท้ายในตำแหน่งแรก

แสดงองค์ประกอบ

เพิ่มผู้ฟังและสลับหน้าในกิจกรรมจาก 4 เป็น 1 และจาก 0 เป็น 3

สลับองค์ประกอบ

นั่นคือทั้งหมดที่

ฉันไม่แนะนำให้คุณใช้แอนิเมชั่นที่นั่นหรือเลย์เอาต์ที่หนักหน่วง มันอาจจะล้าหลังเมื่อองค์ประกอบสลับกัน (บางทีฉันไม่พบความล่าช้าใดๆ เลย)

นอกจากนี้ อย่าตั้งค่าอะแดปเตอร์นี้เป็นเพจเจอร์มากกว่าหนึ่งครั้ง หรือย้าย SwapPageListener ไปที่คลาสภายนอก และตั้งค่าไว้ในบล็อกการเริ่มต้น

person Anrimian    schedule 16.10.2017

สำหรับการเลื่อนแบบไม่จำกัดจำนวนวัน สิ่งสำคัญคือคุณต้องมีส่วนที่ดีในเพจเจอร์ ดังนั้นฉันจึงเขียนคำตอบลงในหน้านี้ (Viewpager ใน Android เพื่อสลับระหว่างวันอย่างไม่มีที่สิ้นสุด)

มันทำงานได้ดีมาก! คำตอบข้างต้นไม่ได้ผลสำหรับฉันเพราะฉันต้องการให้มันทำงาน

person Richard Lindhout    schedule 01.05.2014

RecyclerViewPager ได้ติดตั้งใช้งาน infinite scrolling และสามารถเลื่อนได้เหมือนแกลเลอรี

person panwy    schedule 30.10.2015

person    schedule
comment
อธิบายและเยื้องคำตอบของคุณ! - person Hemant Kaushik; 06.11.2018