关于ViewPager和Fragment的使用初级。适合初学者

使用的ViewPager是android.support.v4.包下的。

demo one:

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;

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

import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.ImageView;

public class MainActivity extends Activity {
    // 做图片轮播
    // 准备视图资源
    List<ImageView> list = new ArrayList<ImageView>();
    // 准备pageadapter
    // 声明viewpager
    private ViewPager mVp;
    private MyPageAdapter adapter;
    
    private Handler handler=new Handler(){
        public void handleMessage(Message msg) {
            //执行viewpage切换
            mVp.setCurrentItem(msg.what);
            
        };
    };
    int index=0;//切换所需要提供的下标
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mVp = (ViewPager) findViewById(R.id.vp);
        // 准备图片资源
        for (int i = 0; i < 4; i++) {
            ImageView img = new ImageView(this);
            img.setImageResource(R.drawable.ic_launcher);
            list.add(img);
        }
        //声明适配器绑定资源
        adapter=new MyPageAdapter();
        mVp.setAdapter(adapter);
        //viewpager 实现自动的轮播
        //启用一个线程不断给handler
        //发送请求由handler做切换的媒体
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                while (true) {
                    //定时发送handler
                    SystemClock.sleep(3000);
                    index++;
                    if(index>list.size()){
                        index=0;
                    }

                    handler.sendEmptyMessage(index);
                    
                }

                
            }
        }).start();

    }

    // 准备适配器
    class MyPageAdapter extends PagerAdapter {

        @Override // 强制重写--切换视图的数量
        public int getCount() {
            return list.size();
        }

        @Override // 强制重写--判断页面死否为同一资源
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        // 重写两个非抽象方法(重要)
        @Override//  页面销毁调用
        public void destroyItem(ViewGroup container, int position, Object object) {
            // super.destroyItem(container, position, object);
            container.removeView(list.get(position));
        }

        @Override //页面缓存调用
        public Object instantiateItem(ViewGroup container, int position) {
            //return super.instantiateItem(container, position);
            //得到要切换的视图
            ImageView img=list.get(position);
            //要切换的视图添加到container
            container.addView(img);
            //返回获得视图
            return  img;
        }

    }

}

基本的逻辑思路:

在布局文件中创建布局文件并添加ViewPager

上例中只简单的显示图片,所以ViewPager中直接 使用Imageview控件。创建一个集合用于保存在ViewPager中用到的Imageview,初始化时

new Imageview 并添加到集合中以供在ViewPager中使用,准备适配器使用继承PagerAdapter,其中自动生成两个抽象方法需要重写。另外需要手动添加

两个非抽象方法public void destroyItem(ViewGroup container, int position, Object object)此方法是当页面销毁时调用, 以及public Object instantiateItem(ViewGroup container, int position)此方法当页面缓存时调用。实现图片的轮播启动一个工作线程,在此线程中执行耗时操作休眠,然后通过消息发送传递给主线程,在主线程中执行

ViewPager的setCurrentItem()方法更新界面。

Fragment就是通常所说的碎片,是现在比较流行的一种功能。使用时可以将其比作一个Activity。一般创建一个新的碎片继承Fragment,并重写其中的onCreatView方法,

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 得到视图
        View v=inflater.inflate(R.layout.two_f, null);
        return v;
    }
在这个方法中得到视图    ,其中的第一个参数是一个页面布局,布局中可以添加你想要的控件等等。
import android.os.Bundle;
import android.view.View;
import android.app.Activity;

public class MainActivity extends Activity {
    //准备碎片管理器
    private android.app.FragmentManager man;
    //准备碎片的处理事务
    private android.app.FragmentTransaction  tra;
    OneFragmnet one;
    TwoFragmnet two;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //创建切换碎片的对象
        one =new OneFragmnet();
         two =new TwoFragmnet();
        //管理器
        man=getFragmentManager();
        //事务初始化
        tra=man.beginTransaction();
        tra.replace(R.id.fl, one);
        //事务使用时候如何执行
        tra.commit();
    }

    public void doClick(View v){
        
        switch (v.getId()) {
        case R.id.button1:
            tra=man.beginTransaction();
            tra.replace(R.id.fl, one);
            break;
        case R.id.button2:
            tra=man.beginTransaction();
            tra.replace(R.id.fl, two);
            break;

        }
        tra.commit();
    }
   
}

在这里我们要使用到FragmentManager这个管理者和FragmentTransaction这个处理事务。而同时在Activity的布局文件中使用了Framelayout,作为

Fragment的载体。

下面我们来说说ViewPager与Fragment的连用:

基本思路是将ViewPager作为容器,将碎片添加到容器中。

注意这里为ViewPager配置的适配器不再是PagerAdapter而是FragmentPagerAdapter了。

public class MainActivity extends FragmentActivity {
    //用于存储切换的碎片
    private List<Fragment> list=new ArrayList<Fragment>();
    //准备适配器
    private  FragmentPagerAdapter adapter;
    private ViewPager mVp;
    private RadioGroup mRg;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         init();
         setAdapter();
        Linten();
        
    }

    /**
     * 处理初始化相关问题
     */
    public void init(){
        HotFragment hot=new HotFragment();
        NewFragment ne=new NewFragment();
        //数据的添加
        list.add(hot);
        list.add(ne);
        mVp=(ViewPager) findViewById(R.id.vp);
        mRg=(RadioGroup) findViewById(R.id.rg);
    }
    
    /**
     * 处理适配器绑定
     */
    public void setAdapter(){
        //通过内部类形式获取适配器
        adapter=new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return list.size();
            }
            @Override
            public Fragment getItem(int arg0) {
                return list.get(arg0);
            }
        };
        
        mVp.setAdapter(adapter);
    }
/**
 * 处理监听事件
 */
public void  Linten(){
    //radio按钮监听
    
    mRg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            
            switch (checkedId) {
            case R.id.rb_hot:
                mVp.setCurrentItem(0);
                break;
            case R.id.rb_new:
                mVp.setCurrentItem(1);
                break;
            }
        }
    });
    
   
        
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {    
        }      //hushi
        
        @Override
        public void onPageScrollStateChanged(int arg0) {
            //hushi
        }
    });
    
    
    
}
    
    
    //采用继承类方式获得适配器
//    class myFr extends FragmentPagerAdapter{
//
//        public myFr(FragmentManager fm) {
//            super(fm);
//            // TODO Auto-generated constructor stub
//        }
//
//        @Override
//        public Fragment getItem(int arg0) {
//            // TODO Auto-generated method stub
//            return null;
//        }
//
//        @Override
//        public int getCount() {
//            // TODO Auto-generated method stub
//            return 0;
//        }
//        
//    }

}

这里的Activity是继承自FragmentActivity,我们需要创建一个集合来储存Fragment,为ViewPager配置适配器来显示Fragment。在适配器中

重写抽象方法即可。另外还添加了RadioButton的监听事件。这个只是随便添加的啦,哈哈。

另另外,
    //viewpager添加监听
    mVp.setOnPageChangeListener(new OnPageChangeListener() {
        
        @Override
        public void onPageSelected(int arg0) {
            switch (arg0) {
            case 0://切的热歌
                mRg.check(R.id.rb_hot);
                break;
            case 2://切的新歌
                mRg.check(R.id.rb_new);
                break;

            
            }
            
        }
       
这里是为ViewPager配置了监听,当当前的ViewPager上的碎片Fragment改变时,相应的Radiobutton会被随之选中。



你可能感兴趣的:(关于ViewPager和Fragment的使用初级。适合初学者)