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);
}
}
}