ViewPager循环滑动和靠按钮来控制循环滑动

ViewPager用按钮来控制,昨天说了一种方式是直接设置setcurrentItem(),但是今天发现如果我们要设置viewpager循环滑动的话这种方式似乎不可行,于是看源码发现了Viewpager的一个公共方法,Viewpager.arrowScroll() 1代表左侧滑动2代表右侧滑动下面贴上源码大家就了解了

    public boolean executeKeyEvent(KeyEvent event) {  
        boolean handled = false;  
        if (event.getAction() == KeyEvent.ACTION_DOWN) {  
            switch (event.getKeyCode()) {  
                case KeyEvent.KEYCODE_DPAD_LEFT://键盘方向键左键的控制,向左翻页  
                    handled = arrowScroll(FOCUS_LEFT);//FOCUS_LEFT:17  
                    break;  
                case KeyEvent.KEYCODE_DPAD_RIGHT://右键  
                    handled = arrowScroll(FOCUS_RIGHT);//FOCUS_RIGHT:66  
                    break;  
                case KeyEvent.KEYCODE_TAB:  
                    if (Build.VERSION.SDK_INT >= 11) {  
                        // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD  
                        // before Android 3.0. Ignore the tab key on those devices.  
                        if (KeyEventCompat.hasNoModifiers(event)) {  
                            handled = arrowScroll(FOCUS_FORWARD);//FOCUS_FORWARD:2  
                        } else if (KeyEventCompat.hasModifiers(event, KeyEvent.META_SHIFT_ON)) {  
                            handled = arrowScroll(FOCUS_BACKWARD);//FOCUS_BACKWARD:1  
                        }  
                    }  
                    break;  
            }  
        }  
        return handled;  
    }  

上面是实现按钮左右滑动,
下面实现Viewpager左右无限循环滑动,当然这种方式并不是真正意义上的循环滑动只不过是修改了适配器里getcount的方法返回一个无限大的值,adapter中的getView方法中的position重新根据实际数量取模,把viewpager设置在max二分之一的位置。因为这个值很大所以基本不可能滑动到position=0或者position=max的位置,给人的视觉上的效果还是左右滑动的,这样注意要设置viewpager的初始项目
我一般这样设置ViewPager.setcurrentpage(2*100);这样使用户看不到边界即可左侧滑动否则不能向左侧滑动,下面我们来看代码

package com.example.viewpager;

import java.util.ArrayList;
import java.util.List;

import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
    ViewPager pager ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<View> view = new ArrayList<View>();
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < 10; i++) {
            view.add(LayoutInflater.from(this).inflate(R.layout.item, null));
            list.add(i + "");
        }
        pager = (ViewPager) findViewById(R.id.viewpager);
        pager.setAdapter(new myadapter(view, this, list));
        pager.setCurrentItem(2*100);/**初始化为这个 使用户看不到边界才能左侧滑动*/
        findViewById(R.id.left).setOnClickListener(l);
        findViewById(R.id.right).setOnClickListener(l);
    }
    View.OnClickListener l=new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            switch(v.getId()){
            case R.id.left:
                /**左侧滑动 此方法是Viewpager的一个自带方法*/
                pager.arrowScroll(1);
                break;
            case R.id.right:
                /**右侧滑动 此方法是Viewpager的一个自带方法*/
                pager.arrowScroll(2);
                break;
            }
        }
    };
    class myadapter extends PagerAdapter {
        List<View> list;
        Context context;
        List<String> sss;

        public myadapter(List<View> list, Context context, List<String> sss) {
            this.list = list;
            this.context = context;
            this.sss = sss;
        }

        @Override
        public int getCount() {
            /** 设置成最大,使用户看不到边界*/
            return Integer.MAX_VALUE;
        }

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

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

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // container.removeView(list.get(position));
            // 销毁不需要的视图 这里并不需要调用
//          ((ViewGroup) container).removeView((View) object);
        }
        /**int posi;不能讲位置拿到外面来否则页面点击事件会乱序*/
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            final int posi = position % sss.size();
             //如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。  
            container.removeView(list.get(posi));
            //控件什么的尽量重新创建避免出现被父容器包裹着的异常抛出
            TextView textView = (TextView) list.get(posi).findViewById(
                    R.id.text);
            textView.setText(sss.get(posi));
            container.addView(list.get(posi));
            list.get(posi).setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Toast.makeText(context,posi+"" , Toast.LENGTH_SHORT).show();    
                }
            });
            return list.get(posi);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值