ViewPager 無限循環

Overview

咱們在使用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 繼承 blog

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

相關文章
相關標籤/搜索