二次元程序猿 2015-09-02 15:06 采纳率: 0%
浏览 2993

关于ViewPager的无限循环

最近学习了viewPager的用法,但是发现当手动滑动viewPager时无法实现无限循环,网上百度了一下,大家都是用的通过设置count的长度为一个很大的值,比如Integer.MAX_VALUE,再用取余的方法去添加view,老师也是这样讲的,但这样并没有达到理论上的无限循环,而且如果我在页面添加一组RadioButton来跳转到对应页面的话也会报错,所以自己想了一下,用另一种方法来实现了真正的无限循环和添加RadioButton,大家看看代码给点意见,我这样是否有不妥
Java代码:
package com.example.android_viewpager;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.R.integer;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;

public class MainActivity extends Activity {
private ViewPager viewPager;
private int[] ImageId;
private LinkedList list;
private ImageView imageView;
private TextView textView;
private Handler handler;
private boolean flag = true;
private MyAdapter myAdapter;
private Map textmap;
private Map rbmap;
private Map rbmap1;
private RadioGroup rg;
private RadioButton rb1, rb2, rb3, rb4, rb5;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    viewPager = (ViewPager) findViewById(R.id.vp);
    textView = (TextView) findViewById(R.id.text);

    rg = (RadioGroup) findViewById(R.id.rg);
    rb1 = (RadioButton) findViewById(R.id.rb1);
    rb2 = (RadioButton) findViewById(R.id.rb2);
    rb3 = (RadioButton) findViewById(R.id.rb3);
    rb4 = (RadioButton) findViewById(R.id.rb4);
    rb5 = (RadioButton) findViewById(R.id.rb5);

    ImageId = getImageId();
    list = getImageView();
    textmap = getText();
    rbmap = getRadioButton();
    rbmap1 = getRadioButton1();

    rb3.setChecked(true);
    textView.setText(textmap.get(list.get(2)));
    myAdapter = new MyAdapter();
    viewPager.setAdapter(myAdapter);

    viewPager.setOnPageChangeListener(new MyOnClick());
    viewPager.setCurrentItem(2);

    rg.setOnCheckedChangeListener(new MyOnChangeLister());
    // isHandler();
    // handler.sendEmptyMessageDelayed(0, 2000);
}
class MyOnChangeLister implements OnCheckedChangeListener{

    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        int indexOf;
        switch (checkedId) {
        case R.id.rb1:
            indexOf = list.indexOf(rbmap1.get(rb1));
            viewPager.setCurrentItem(indexOf);
            break;
        case R.id.rb2:
            indexOf = list.indexOf(rbmap1.get(rb2));
            viewPager.setCurrentItem(indexOf);
            break;
        case R.id.rb3:
            indexOf = list.indexOf(rbmap1.get(rb3));
            viewPager.setCurrentItem(indexOf);
            break;
        case R.id.rb4:
            indexOf = list.indexOf(rbmap1.get(rb4));
            viewPager.setCurrentItem(indexOf);
            break;
        case R.id.rb5:
            indexOf = list.indexOf(rbmap1.get(rb5));
            viewPager.setCurrentItem(indexOf);
            break;

        default:
            break;
        }

    }

}
private Map<RadioButton, ImageView> getRadioButton1() {

    Map<RadioButton, ImageView> map = new HashMap<RadioButton, ImageView>();
    map.put(rb1, list.get(0));
    map.put(rb2, list.get(1));
    map.put(rb3, list.get(2));
    map.put(rb4, list.get(3));
    map.put(rb5, list.get(4));
    return map;
}

private Map<ImageView, RadioButton> getRadioButton() {
    Map<ImageView, RadioButton> map = new HashMap<ImageView, RadioButton>();
    map.put(list.get(0), rb1);
    map.put(list.get(1), rb2);
    map.put(list.get(2), rb3);
    map.put(list.get(3), rb4);
    map.put(list.get(4), rb5);
    return map;
}

// private void isHandler() {
// handler = new Handler() {
//
// @Override
// public void handleMessage(Message msg) {

// viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
// if (flag) {
// sendEmptyMessageDelayed(0, 2000);
// }
//
// }
// };
//
// }

@Override
protected void onDestroy() {
    flag = false;
    super.onDestroy();
}

class MyOnClick implements OnPageChangeListener {

    @Override
    public void onPageScrollStateChanged(int arg0) {

    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {

    }

    @Override
    public void onPageSelected(int position) {

        textView.setText(textmap.get(list.get(position)));
        RadioButton radioButton = rbmap.get(list.get(position));
        radioBtn();
        radioButton.setBackgroundResource(R.drawable.b);
        getImageView2(position);
    }

}

class MyAdapter extends PagerAdapter {

    public int getCount() {
        return list.size();
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        viewPager.addView(list.get(position));
        return list.get(position);
    }

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

private Map<ImageView, String> getText() {
    Map<ImageView, String> map = new HashMap<ImageView, String>();
    map.put(list.get(0), "第一个界面");
    map.put(list.get(1), "第二个界面");
    map.put(list.get(2), "第三个界面");
    map.put(list.get(3), "第四个界面");
    map.put(list.get(4), "第五个界面");
    return map;
}

private void getImageView2(int i) {
    switch (i) {
    case 0:
        for(int j=0;i<2;i++){
            ImageView imageView1 = list.getLast();
            list.removeLast();
            list.addFirst(imageView1);
        }
        viewPager.setAdapter(myAdapter=new MyAdapter());
        viewPager.setCurrentItem(2);
        break;
    case 1:
        ImageView imageView2 = list.getLast();
        list.removeLast();
        list.addFirst(imageView2);
        viewPager.setAdapter(myAdapter=new MyAdapter());
        viewPager.setCurrentItem(2);
        break;
    case 3:
        ImageView imageView3 = list.getFirst();
        list.removeFirst();
        list.addLast(imageView3);
        viewPager.setAdapter(myAdapter=new MyAdapter());
        viewPager.setCurrentItem(2);
        break;
    case 4:
        for(int j=0;j<2;j++){
            ImageView imageView4 = list.getFirst();
            list.removeFirst();
            list.addLast(imageView4);
        }
        viewPager.setAdapter(myAdapter=new MyAdapter());
        viewPager.setCurrentItem(2);
        break;
    default:
        break;
    }

}

private LinkedList<ImageView> getImageView() {
    list = new LinkedList<ImageView>();
    for (int i = 0; i < ImageId.length; i++) {
        imageView = new ImageView(this);
        imageView.setBackgroundResource(ImageId[i]);
        list.add(imageView);
    }
    return list;
}

private int[] getImageId() {

    return new int[] { R.drawable.pic1, R.drawable.pic2, R.drawable.pic3,
            R.drawable.pic4, R.drawable.pic5 };
}
private void radioBtn(){
    rb1.setBackgroundResource(R.drawable.a);
    rb2.setBackgroundResource(R.drawable.a);
    rb3.setBackgroundResource(R.drawable.a);
    rb4.setBackgroundResource(R.drawable.a);
    rb5.setBackgroundResource(R.drawable.a);
}

}

  • 写回答

3条回答 默认 最新

  • Robot-S 2015-09-02 15:10
    关注

    One possibility is setting up the screens like this:

    C' A B C A'

    C' looks just like C, but when you scroll to there, it switches you to the real C. A' looks just like A, but when you scroll ......
    答案就在这里:viewpager无限循环
    ----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog