最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android ViewPager實現(xiàn)無限循環(huán)效果

 更新時間:2021年11月04日 11:00:43   投稿:lijiao  
這篇文章主要為大家詳細介紹了Android ViewPager實現(xiàn)無限循環(huán)效果的相關(guān)資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近項目里有用到ViewPager來做廣告運營位展示,看到現(xiàn)在很多APP的廣告運營位都是無限循環(huán)的,所以就研究了一下這個功能的實現(xiàn)。

先看看效果

從一個方向上一直滑動,么有滑到盡頭的感覺,具體是怎么實現(xiàn)的呢?看下面的思路。

實現(xiàn)思路

此處畫了一幅圖來表達實現(xiàn)無限循環(huán)的思路,即在數(shù)據(jù)起始位置前插入最后一項數(shù)據(jù),在最后一項數(shù)據(jù)后插入第一項數(shù)據(jù),當(dāng)滑動到此處時,更新頁面的索引位置就ok了 。

代碼實現(xiàn)

這個方法用于數(shù)據(jù)處理,其中mediaList是原始數(shù)據(jù),newMediaList是處理完的數(shù)據(jù),mMediaList是用于頁面顯示的數(shù)據(jù)。

public void initItemList(List<MediaIntro> mediaList){
      List<MediaIntro> newMediaList = new ArrayList<MediaIntro>();
      newMediaList.addAll(mediaList);
      if(newMediaList.size() > 1){
        //第0個位最后一個,向左拉動時,可以實現(xiàn)直接滑動到最后一個,最后一個是第0個,可以實現(xiàn)向右滑動的時直接跳到第0個
        newMediaList.add(0,mediaList.get(mediaList.size() -1));
        newMediaList.add(mediaList.get(0));
      }
      mMediaList = newMediaList;
    }

完整的adapter的代碼:

public class AdImagePagerAdapter extends RecyclingPagerAdapter{
    private LayoutInflater mInflater;
    private List<MediaIntro> mMediaList = new ArrayList<MediaIntro>();

    private boolean isInfiniteLoop; //是否無限循環(huán)
    int size;

    public AdImagePagerAdapter (LayoutInflater inflater ,List<MediaIntro> mediaList){
      mInflater = inflater;
      isInfiniteLoop = false;
      initItemList(mediaList);
      size = mMediaList.size();
    }

    public void initItemList(List<MediaIntro> mediaList){
      List<MediaIntro> newMediaList = new ArrayList<MediaIntro>();
      newMediaList.addAll(mediaList);
      if(newMediaList.size() > 1){
        //第0個位最后一個,向左拉動時,可以實現(xiàn)直接滑動到最后一個,最后一個是第0個,可以實現(xiàn)向右滑動的時直接跳到第0個
        newMediaList.add(0,mediaList.get(mediaList.size() -1));
        newMediaList.add(mediaList.get(0));
      }
      mMediaList = newMediaList;
    }

    public MediaIntro getItem(int position){
      return mMediaList.get(position);
    }
    public int getPosition(int position){
      return isInfiniteLoop? position%size:position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      final ViewHolder holder;
      final MediaIntro media = getItem(position);
      if(convertView == null){
        holder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.home_ad_item, parent,false);
        holder.mImageView = (ImageView)convertView.findViewById(R.id.homeAdItemImg);
        holder.mTextView = (TextView)convertView.findViewById(R.id.homeAdItemTxt);
        convertView.setTag(holder);
      }else{
        holder=(ViewHolder)convertView.getTag();
      }
      if(media.source.equals(MagicSource.SOURCE_OUT_AD)){
        imageLoader.displayImage(adImageUrl,holder.mImageView,adImageOptions,null,null);
        holder.mTextView.setText("");
        holder.mImageView.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
            // TODO Auto-generated method stub
            //廣告點擊事件
          }
        });
      }else {
        imageLoader.displayImage(media.imgUrl, holder.mImageView,adImageOptions,null,null);
        holder.mTextView.setText(media.desc+"");
        holder.mImageView.setOnClickListener(new OnClickListener() {

          @Override
          public void onClick(View v) {
            // TODO Auto-generated method stub
            startMediaDetail(media);
          }
        });
      }
      return convertView;
    }
    @Override
    public int getCount() {
      // TODO Auto-generated method stub
      return isInfiniteLoop ? Integer.MAX_VALUE : mMediaList.size();
    }
    private class ViewHolder{
      ImageView mImageView = null;
      TextView mTextView = null;
    }
    public boolean isInfiniteLoop(){
      return isInfiniteLoop;
    }
    public AdImagePagerAdapter setInfiniteLoop(boolean isInfiniteLoop){
      this.isInfiniteLoop =isInfiniteLoop;
      return this;
    }
  }

更新頁面索引的代碼:

@Override
    public void onPageSelected(int position) {
      // TODO Auto-generated method stub

      if(adImageAdapter.getCount()>1){ 
        if(position<1){
          position=adImageAdapter.getCount()-2;
          adViewPager.setCurrentItem(adImageAdapter.getCount()-2,false);
        }else if(position > adImageAdapter.getCount()-2){
          position = 1;
          adViewPager.setCurrentItem(1, false);
        }
        setAdPagePointSelected(position-1);
      }
    }

完整的滑動監(jiān)聽器代碼

public class OnAdPageChangeListener implements OnPageChangeListener{

    @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

    }

    @Override
    public void onPageSelected(int position) {
      // TODO Auto-generated method stub

      if(adImageAdapter.getCount()>1){ 
        if(position<1){
          position=adImageAdapter.getCount()-2;
          adViewPager.setCurrentItem(adImageAdapter.getCount()-2,false);
        }else if(position > adImageAdapter.getCount()-2){
          position = 1;
          adViewPager.setCurrentItem(1, false);
        }
        setAdPagePointSelected(position-1);
      }
    }

  }

以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)Android軟件編程有所幫助。

相關(guān)文章

最新評論

邯郸县| 富蕴县| 青田县| 宜都市| 信阳市| 武平县| 通州区| 南阳市| 格尔木市| 休宁县| 灵丘县| 栾川县| 中江县| 岳普湖县| 三门峡市| 夹江县| 麻阳| 郓城县| 河池市| 田林县| 阆中市| 合肥市| 侯马市| 巩留县| 固镇县| 崇明县| 临潭县| 宜州市| 廊坊市| 资中县| 海城市| 稻城县| 奇台县| 拜泉县| 长寿区| 仙游县| 德阳市| 东乌| 开江县| 吴忠市| 定州市|