Android 使用ViewPager實現(xiàn)無限無縫循環(huán)

做這個之前 百度了一些資料大多數(shù)都是將count設(shè)置為integerMax 然后通position%count 方式取得對應(yīng)的數(shù)據(jù)集 這樣雖然可以做到無限循環(huán) 但是有兩個弊端 首先會創(chuàng)建大量對象,性能方面肯定是不好,其次是從第一頁向右邊滑的時候是無法滑動的。
今天給大家分享個實現(xiàn)思路如下圖

創(chuàng)建三個圖片視圖放入ViewPager中 默認(rèn)選中第二頁 ,在接下來的滑動中每次滑動結(jié)束之后都將當(dāng)前頁碼設(shè)置為第二頁,然后通過判斷是向左向右滑動來設(shè)置視圖中數(shù)據(jù)集,這樣就可以實現(xiàn)無限循環(huán)了 而且只會創(chuàng)建三個圖片視圖對象.

swift代碼實現(xiàn)

之前代碼不嚴(yán)謹(jǐn)這里做下更新 方便有需要的童鞋
下面是代碼 實現(xiàn)

package com.cn.gank_io.activity;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.List;

public class BannerAdapter extends PagerAdapter
    implements ViewPager.OnPageChangeListener, View.OnClickListener {

  private ViewPager viewPager;

  private final static int PAGE = 0x03;
  private final static int INDEX = 1;
  private final static int START_INDEX = 0;

  private List<String> dataSource;
  private ArrayList<ImageView> views;
  private Context context;
  //記錄真正的位置
  private int currentPage;

  private ItemClickListener itemClickListener;

  public BannerAdapter(Context context, ViewPager viewPager, List<String> dataSource) {
    this.context = context;
    this.dataSource = dataSource;
    this.viewPager = viewPager;
    viewPager.clearOnPageChangeListeners();
    viewPager.addOnPageChangeListener(this);
    if (null == dataSource || dataSource.isEmpty()) return;
    initView(false);
    setDataToView();
  }

  public void setItemClickListener(ItemClickListener itemClickListener) {
    this.itemClickListener = itemClickListener;
  }

  public void nextPage() {
    if (null == dataSource || dataSource.isEmpty()) return;
    //因為位置始終為1 那么下一頁就始終為2
    viewPager.setCurrentItem(2, true);
  }

  /**
   * 初始化圖形控件
   * 為image填充數(shù)據(jù)
   */
  private void initView(boolean isScale) {
    views = new ArrayList<>();
    if (dataSource.size() == 1) {
      views.add(getImageView());
      return;
    }
    for (int i = 0; i < PAGE; i++) {
      views.add(getImageView());
    }
  }

  private void setDataToView() {
    int size = dataSource.size();
    if (size == 1) {
      Glide.with(context).load(dataSource.get(0)).into(views.get(0));
      return;
    }
    for (int i = 0; i < PAGE; i++) {
      int index = 0;
      if (0 == i) {
        index = size - 1;
      } else {
        index = i - 1;
      }
      Glide.with(context).load(dataSource.get(index)).into(views.get(i));
    }
  }

  public void showIndex(int index) {
    if (null == dataSource || dataSource.isEmpty()) return;
    if (index == dataSource.size()) {
      currentPage = 0;
    } else {
      currentPage = index;
    }
    if (dataSource.size() == 1) {
      Glide.with(context).load(dataSource.get(0)).into(views.get(0));
    } else {
      indexChange();
    }
  }

  /**
   * get imageView
   */
  private ImageView getImageView() {
    ImageView imageView = new ImageView(context);
    imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT));
    imageView.setClickable(true);
    imageView.setOnClickListener(this);
    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    return imageView;
  }

  @Override public int getCount() {
    return (null == views) ? 0 : views.size();
  }

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

  @Override public Object instantiateItem(ViewGroup container, int position) {
    ImageView imageView = views.get(position);
    if (null != imageView.getParent()) {
      ViewGroup viewGroup = (ViewGroup) imageView.getParent();
      viewGroup.removeView(imageView);
    }
    container.addView(imageView);
    return imageView;
  }

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

  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    if (dataSource.size() == 1) {
      return;
    }
    if (0 != positionOffset) return;

    if (position == INDEX) {
      return;
    }
    if (position > INDEX) {
      currentPage++;
    } else {
      currentPage--;
    }
    if (currentPage == -INDEX) {
      currentPage = dataSource.size() - INDEX;
    } else if (currentPage == dataSource.size()) {
      currentPage = START_INDEX;
    }
    indexChange();
  }

  private void indexChange() {
    if (currentPage == START_INDEX) {
      Glide.with(context).load(dataSource.get(dataSource.size() - 1)).into(views.get(0));
    } else {
      Glide.with(context).load(dataSource.get(currentPage - 1)).into(views.get(0));
    }
    Glide.with(context).load(dataSource.get(currentPage)).into(views.get(1));
    if (currentPage == dataSource.size() - 1) {
      Glide.with(context).load(dataSource.get(0)).into(views.get(2));
    } else {
      if (currentPage == 0 && dataSource.size() == 2) {
        Glide.with(context).load(dataSource.get(dataSource.size() - 1)).into(views.get(2));
      } else {
        Glide.with(context).load(dataSource.get(currentPage+1)).into(views.get(2));
      }
    }
    viewPager.setCurrentItem(1, false);
  }

  @Override public void onPageSelected(int position) {
  }

  @Override public void onPageScrollStateChanged(int state) {
  }

  @Override public void onClick(View v) {
    if (null!=itemClickListener)itemClickListener.onItemClick(currentPage);
  }

  public int getCurrentPage() {
    return currentPage;
  }

  public interface ItemClickListener {
    void onItemClick(int index);
  }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容