ViewPager进行抽取,对外直接使用

给公司做项目时间当时因为比较赶,首页使用了listview+Viewpager实现。当时代码都写到了一个类中,导致每次看首页都有种疯了的感觉,最近没事对首页进行了重构,将Viewpager单独抽取,listview改为新控件RecyclerView。虽然比较简单,网上也有很多实现好的开源项目,但是做为自己学习还是动手做了,然后记录下来吧。这篇我们先来看ViewPager的实现吧。
下面还是先来看个效果图吧:
这里写图片描述
呀,录制的貌似有点卡了,好吧将就看下吧。
首先是布局,也很简单是LinearLayout包了个RelativeLayout,然后RelativeLayout中有一个ViewPager和一个LinearLayout(用于底部的指示点)。看下吧(最外层的LinearLayout没有给出来)

 <RelativeLayout
        android:id="@+id/rl_head"
        android:layout_width="match_parent"
        android:layout_height="135dp">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="135dp"/>

        <LinearLayout
            android:id="@+id/index_point"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@android:color/transparent"
            android:gravity="center"
            android:orientation="horizontal"
            android:layout_marginRight="10dp"
            android:layout_marginBottom="8dp">
        </LinearLayout>

    </RelativeLayout>

我们还是先说下实现思路吧:首先我们创建一个普通的java类,MyViewPager(既我们抽取的ViewPager实现类)。然后在我们的MainActivity中先创建假数据,然后获取布局实例,将布局,上下文,数据传递给MyViewPager(通过构造传递)。这时MyViewPager已经拿到了我们ViewPager显示需要的数据,那么接下来我们在showViewpager()中进行操作,然后调用showViewpager()这个方法就OK了。当然了我们还需要一个接口,在MainActivity启动时间发消息给MyViewPager通过Handler对图片进行轮播。

这就是实现思路,接下来我们看下代码吧:

MainActivity代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ll_headparent = (LinearLayout) findViewById(R.id.ll_headparent);
        rl_head = (RelativeLayout) findViewById(R.id.rl_head);
        point = (LinearLayout) findViewById(R.id.index_point);
        ViewPager viewpager = (ViewPager) findViewById(R.id.viewpager);
        recycler = (WrapRecyclerView) findViewById(R.id.recycler);
        initData();
        // 拿到MyViewPager实例,传送数据
        MyViewPager mMyViewPager = new MyViewPager(this,viewpager,mList,point);
        // 显示ViewPager
        mMyViewPager.showViewpager();
    }
    private int[] banner = new int[] {R.mipmap.banner1,R.mipmap.banner2,R.mipmap.banner3};
    private void initData(){
        mList = new ArrayList<Integer>();
        for (int i = 0; i < 3; i++) {
            mList.add(banner[i]);
        }
    }

     @Override
    protected void onStart() {
        super.onStart();
        // 开始轮播
        mStartViewpager.startViewpager(true);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 停止轮播
        mStartViewpager.startViewpager(false);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 停止轮播
        mStartViewpager.startViewpager(false);
    }

    //下面是回调接口:
    private StartViewpager mStartViewpager;
    public interface StartViewpager{
        void startViewpager(boolean isStart);
    }
    public void setStartViewpager(StartViewpager mStartViewpager){
        this.mStartViewpager = mStartViewpager;
    }

MyViewPager代码,需要实现 MainActivity.StartViewpager接口

private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1);
            handler.sendEmptyMessageDelayed(0,2000);
        }
    };

    public MyViewPager(Context context,ViewPager viewPager,ArrayList<Integer> list,LinearLayout point){
        this.mContext = context;
        this.mViewPager = viewPager;
        this.mArrayList = list;
        this.mPoint = point;
        ((MainActivity)mContext).setStartViewpager(MyViewPager.this);
    }

    public void showViewpager(){
        mViewPager.setCurrentItem(mArrayList.size() * 500);
        initPoint();
        mViewPager.setAdapter(new MyViewpagerAdapter());
        initViewPagetEvent();
    }
    // 初始化底部的指示点
     private void initPoint(){
        for (int i = 0; i < mArrayList.size(); i++) {
            ImageView pointImage = new ImageView(mContext);
            pointImage.setImageResource(R.drawable.fragment_index_point);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
       (LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
            params.rightMargin=10;
            if (i > 0){
                params.rightMargin = 10;
                pointImage.setEnabled(false);
            }
            pointImage.setLayoutParams(params);
            mPoint.addView(pointImage);
        }
    }
    // viewpager的adapter
    private class MyViewpagerAdapter extends PagerAdapter{

        @Override
        public int getCount() {
            return mArrayList.size() * 1000;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            int pos = position % mArrayList.size();
            ImageView imageView = new ImageView(mContext);
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            for (int i = 0; i < mArrayList.size(); i++) {
                Integer integer = mArrayList.get(pos);
                imageView.setImageResource(integer);
            }
            container.addView(imageView);
            return imageView;
        }

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

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    }
    // 下面是对ViewPager的滑动和手势的处理
    private void initViewPagetEvent() {

        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                position = position % mArrayList.size();
                mPoint.getChildAt(position).setEnabled(true);
                mPoint.getChildAt(currentPoint).setEnabled(false);
                currentPoint = position;
            }

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

            @Override
            public void onPageScrollStateChanged(int state) {}
        });

        mViewPager.setOnTouchListener(new View.OnTouchListener() {
            int startX = 0;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        handler.removeCallbacksAndMessages(null);
                        startX = (int) event.getX();
                        break;
                    case MotionEvent.ACTION_CANCEL:
                        handler.sendEmptyMessageDelayed(0, 2000);
                        break;
                    case MotionEvent.ACTION_UP:
                        int endX = (int) event.getX();
                        int moveX = endX - startX;
                        if (Math.abs(moveX) < 5) {
                            // viewpager的点击事件
                            Toast.makeText(mContext,"我是头布局:" + mArrayList.get(currentPoint),Toast.LENGTH_SHORT).show();
                        } else {
                            handler.sendEmptyMessageDelayed(0, 2000);
                        }
                        break;
                }
                return false;
            }
        });
    }
    // 实现接口方法
    @Override
    public void startViewpager(boolean isStart) {
        if (isStart){
            handler.sendEmptyMessageDelayed(0, 2000);
            initViewPagetEvent();
        }else{
            handler.removeCallbacksAndMessages(null);
        }
    }

这是初始化指示点时间用到的布局

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/selected_point" android:state_enabled="true"></item>
    <item android:drawable="@drawable/default_point"></item>
</selector>
// default_point
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <size android:height="7dp" android:width="7dp"></size>
    <solid android:color="#6c6c6c"></solid>
    <stroke android:width="1dp" android:color="#c0c0c0"/>
</shape>
// selected_point
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <size android:height="7dp" android:width="7dp"></size>
    <solid android:color="#ffffff"></solid>
</shape>

代码不难,相信大家都能看懂。然后友情提示下:这个抽取没有考虑到当banner只有一张时间的情况,大家做时间可以注意下。那么下篇会讲下将这个viewpager当做head添加给RecyclerView。然后代码也会在下篇一起给出。如果有哪里不足,欢迎大家指教。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个类似于安卓ViewPager的开源库 - iOS ViewPager 高级库 支持 iPhone/ipad/ipod 相关方法 pragma mark - version 1.0 /** * 初始化 YFViewPager的方法 * * @param frame frame * @param titles 标题数组 * @param views 视图数组 和标题数组一一对应 * * @return YFViewPager */ - (id)initWithFrame:(CGRect)frame titles:(NSArray *)titles views:(NSArray *)views; /** * 设置选择的菜单按钮 * * @param index 按钮的索引值 从左到右一次是0,1,2,3... */ - (void)setSelectIndex:(NSInteger)index; /** * 点击菜单按钮时 调用的block方法 * * @param block 返回YFViewPager本身和点击的按钮的索引值,从左到右一次是0,1,2,3... */ - (void)didSelectedBlock:(SelectedBlock)block; pragma mark - version 2.0 /** * 初始化 YFViewPager的方法 也是目前使用的YFViewPager的唯一初始化api * * @param frame frame * @param titles 标题数组 * @param icons 标题右侧图标数组 * @param selectedIcons 标题右侧选中时的图标数组 * @param views 视图数组 和标题数组一一对应 * * @return YFViewPager */ - (id)initWithFrame:(CGRect)frame titles:(NSArray *)titles icons:(NSArray *)icons selectedIcons:(NSArray *)selectedIcons views:(NSArray *)views; /** * 设置菜单标题左边的icon 图标 * * @param icons 图标image * @param selectedIcons 菜单被选中时显示的图标image */ - (void)setTitleIconsArray:(NSArray *)icons selectedIconsArray:(NSArray *)selectedIcons; /** * 设置菜单右上角小红点显示的文字,数组需与菜单一一对应,数字为0时 赋值 @0或@"" * * @param tips 小红点上的文字 */ - (void)setTipsCountArray:(NSArray *)tips;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值