咱們在使用ViewPager來製做圖片輪播的時候,經常爲ViewPager不能一直無限循環的問題所苦惱。對於這個問題,目前從網上找到了兩個思路來解決:java
將 ViewPager 的Count 的數量設置的儘量的大,而後就形成了無限循環的假象。android
第二種,方式是,假如三個圖片無限循環,那麼就須要用5張圖片,以下圖所示git
使用這種方式啓動的時候,須要將 2 號圖片,設置爲第一張,當向前滑動的時候,由於前面的 1號圖片 是和 4 號圖片同樣,那麼,給人的錯覺就像是無線循環的同樣,當選中一號圖片後,當即將當前選中的圖片設置爲 4 號圖片,4號圖片向5號圖片滑動也是同理。ide
關於第一種方式,我想對你們來講都不是問題,本文主要是介紹第二種方式的實現方式post
Step 1: 準備好任意3張圖片測試
Step 2: 創建Adapter,爲了一勞永逸,咱們須要作一些簡單的封裝,來方便咱們之後的使用this
通用的Adaptercode
package com.example.it.recycleviewpager; import android.content.Context; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import java.util.List; /** * Created by 魯迅認識的那隻猹 on 9/25/2017 10:58 AM. * Emial 1258730808@qq.com * Desc: */ public abstract class BaseRecycleViewPagerAdapter<T> extends PagerAdapter { private Context context; private List<T> dataSource; public BaseRecycleViewPagerAdapter(Context context, List<T> dataSource) { this.context = context; this.dataSource = dataSource; //爲了無線循環添加兩個冗餘項目 T t1 = dataSource.get(0); T t2 = dataSource.get(dataSource.size() - 1); this.dataSource.add(dataSource.size() , t1); this.dataSource.add(0, t2); } /** * 返回視圖的數量 */ @Override public int getCount() { return dataSource.size(); } /** * 實例化,Page */ @Override public Object instantiateItem(ViewGroup container, int position) { View view = bindingView(position); container.addView(view); return view; } /*** * 抽象方法,綁定視圖,須要子類實現 */ abstract View bindingView(int position); /** * 回收資源 */ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } public Context getContext() { return context; } public List<T> getDataSource() { return dataSource; } }
創建Adapter,從BaseRecycleViewPagerAdapter
public class AdvertisingAdapter extends BaseRecycleViewPagerAdapter<Integer> { public AdvertisingAdapter(Context context, List<Integer> dataSource) { super(context, dataSource); } /** * 創建咱們須要用來輪播的圖片 */ @Override View bindingView(int postion) { ImageView imageView = new ImageView(getContext()); imageView.setLayoutParams(new ViewGroup.LayoutParams(-1, -1)); imageView.setImageResource(getDataSource().get(postion)); return imageView; } }
Step3: 測試咱們的Adapter繼承
public class MainActivity extends AppCompatActivity { private ViewPager viewPager; private AdvertisingAdapter advertisingAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) this.findViewById(R.id.vp); init(); } void init() { List<Integer> resIdList = new ArrayList<>(); resIdList.add(R.drawable.pet2); resIdList.add(R.drawable.pet3); resIdList.add(R.drawable.pet4); advertisingAdapter = new AdvertisingAdapter(this, resIdList); viewPager.setAdapter(advertisingAdapter); //設置第二張圖片爲最初顯示的圖片 viewPager.setCurrentItem(1); //設置Item的選中事件,實現循環 viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { if (position == 0) viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 2, false); if (position == viewPager.getAdapter().getCount() - 1) viewPager.setCurrentItem(1, false); } }); } }
基本的需求已經實現,若是還有更多的需求,還能夠根據上面的擴展。
個人碼雲: https://gitee.com/ShareKnowledge/RecycleViewPager