viewpager 左右循环 导航任意定位 状态显示

花了3天时间研究了viewpager的使用,对于其原理有了一个深刻的认识,总结如下:

1.在导航栏里任意点击,可以定位到相对应的页面;

2.左右循环控制,页面设置FABCDEFA;

3.从setCurrentItem(1,fasle);

4.注意:导航从12345,页面从0123456;

5.缓存012三个view;


源代码下载:http://download.csdn.net/detail/avenleft/5414673

package com.example.myviewpager;


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


import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.TextView;


/**
 * viewpager使用完整版,实现了循环滑动,以及按钮的点击,状态图标的切换
 * 

public class MainActivity extends Activity {
private static String TAG = "MainActivity";


private static ViewPager viewPager;


private static List<View> views;// viewpager中所有的view
private static List<TextView> textViews;// 首页导航指示


private TextView textView1;
private TextView textView2;
private TextView textView3;
private TextView textView4;
private TextView textView5;
private TextView textView6;


private ImageView imageView;
private ViewGroup main;// 包裹滑动图片LinearLayout
private ImageView[] imageViews;
private ViewGroup group;// 包裹小圆点的LinearLayout


private static int length = 0;


private LayoutInflater inflater;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


initComponent();
initTextView();
initViewPager();
initViewGroup();
setContentView(main);
}


private void initComponent() {
inflater = getLayoutInflater();
main = (ViewGroup) inflater.inflate(R.layout.viewpager_demo1, null);
viewPager = (ViewPager) main.findViewById(R.id.viewpager);
group = (ViewGroup) main.findViewById(R.id.viewGroup);
textView1 = (TextView) main.findViewById(R.id.textView1);
textView2 = (TextView) main.findViewById(R.id.textView2);
textView3 = (TextView) main.findViewById(R.id.textView3);
textView4 = (TextView) main.findViewById(R.id.textView4);
textView5 = (TextView) main.findViewById(R.id.textView5);
textView6 = (TextView) main.findViewById(R.id.textView6);
}


private void initTextView() {
textViews = new ArrayList<TextView>();
textViews.add(textView1);
textViews.add(textView2);
textViews.add(textView3);
textViews.add(textView4);
textViews.add(textView5);
textViews.add(textView6);


textViews.get(0).setTextColor(Color.RED);


textView1.setOnClickListener(new MyTextViewClick(0));
textView2.setOnClickListener(new MyTextViewClick(1));
textView3.setOnClickListener(new MyTextViewClick(2));
textView4.setOnClickListener(new MyTextViewClick(3));
textView5.setOnClickListener(new MyTextViewClick(4));
textView6.setOnClickListener(new MyTextViewClick(5));
}


private void initViewPager() {
views = new ArrayList<View>();


LayoutInflater layoutInflater = LayoutInflater.from(this);
View view1 = (View) layoutInflater.inflate(R.layout.item01, null);
View view2 = (View) layoutInflater.inflate(R.layout.item02, null);
View view3 = (View) layoutInflater.inflate(R.layout.item03, null);
View view4 = (View) layoutInflater.inflate(R.layout.item04, null);
View view5 = (View) layoutInflater.inflate(R.layout.item05, null);
View view6 = (View) layoutInflater.inflate(R.layout.item06, null);


// 循环滑动:头部添加一个和原尾部相同的view,尾部添加一个和原头部相同的view
View view0 = (View) layoutInflater.inflate(R.layout.item06, null);
View view7 = (View) layoutInflater.inflate(R.layout.item01, null);


views.add(view0);
views.add(view1);
views.add(view2);
views.add(view3);
views.add(view4);
views.add(view5);
views.add(view6);
views.add(view7);


length = views.size();// 获得显示页面的实际个数
viewPager.setAdapter(pageAdapter);


viewPager.setCurrentItem(1, false);
// 起始页为第一页,循环显示的时候,61234561,第0个放第6个页面,第7个放第0个页面
viewPager.setOnPageChangeListener(new MyOnPageChangeListener());
}


private void initViewGroup() {
//导航显示只有8-2=6页
imageViews = new ImageView[length-2];
for (int i = 0; i < length-2; i++) {
imageView = new ImageView(MainActivity.this);
imageView.setLayoutParams(new LayoutParams(20, 20));
imageView.setPadding(20, 0, 20, 0);
imageViews[i] = imageView;


if (i == 0) {
// 默认选中第一张图片
imageViews[i]
.setBackgroundResource(R.drawable.page_indicator_focused);
} else {
imageViews[i].setBackgroundResource(R.drawable.page_indicator);
}


group.addView(imageViews[i]);
}
}


private final class MyTextViewClick implements View.OnClickListener {
private int index = 0;


public MyTextViewClick(int i) {
index = i;
}


@Override
public void onClick(View v) {
//导航索引的位置要比实际显示的页面少1
viewPager.setCurrentItem(index + 1, false);//false平滑过渡取消,效果不显示
changeTitleShow(index);
}
}


private void changeTitleShow(int show) {
for (int i = 0; i < textViews.size(); i++) {
if (show == i) {
textViews.get(i).setTextColor(Color.RED);
} else {
textViews.get(i).setTextColor(Color.BLACK);
}
}
}


private static final PagerAdapter pageAdapter = new PagerAdapter() {


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


@Override
public int getCount() {
return length;
}


@Override
public void destroyItem(View container, int position, Object object) {
View currentView = views.get(position);
((ViewPager) container).removeView(currentView);
Log.i(TAG, "destroyItem-" + position + "-" + currentView);
Log.i(TAG, "------------------------------");
}


@Override
public Object instantiateItem(View container, int position) {
View currentView = views.get(position);
((ViewPager) container).addView(currentView);
Log.i(TAG, "instantiateItem-" + position + "-" + currentView);
Log.i(TAG, "------------------------------");
return currentView;
}
};


private final class MyOnPageChangeListener implements OnPageChangeListener {


@Override
public void onPageScrollStateChanged(int arg0) {
// Log.i(TAG,"onPageScrollStateChanged-"+arg0);
// Log.i(TAG,"------------------------------");
}


@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// Log.i(TAG,"onPageScrolled-"+arg0+"-"+arg2);
// Log.i(TAG,"------------------------------");
}


@Override
public void onPageSelected(int position) {
// 当前页为0时改为倒数第二个,也就是实际需要的最后一个view;当前页为最后一个时改为第二个,即实际上的第一个view
Log.i(TAG, "onPageSelected-" + position);
Log.i(TAG, "------------------------------");
int showIndex = position;
if (position == 0) {
showIndex = length - 2;
viewPager.setCurrentItem(length - 2, false);
} else {
if (position == length - 1) {
showIndex = 1;
viewPager.setCurrentItem(1, false);
}
}
changeTitleShow(showIndex - 1);


for (int i = 0; i < imageViews.length; i++) {
imageViews[showIndex - 1]
.setBackgroundResource(R.drawable.page_indicator_focused);


if (showIndex - 1 != i) {
imageViews[i]
.setBackgroundResource(R.drawable.page_indicator);
}
}
}
}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值