Android PullToRefreshListView和ViewPager的结合使用

其实这个不是什么新东西了,在介绍(一)中我们就知道了PullToRefreshListView的用法,这里只要将其放入到ViewPager中就行啦。ViewPager还是和以往一样的定义和使用,在适配器中存视图的时候放入PullToRefreshListView就行。

1.ViewPager的布局文件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#000000">

    <!-- The PullToRefreshListView replaces a standard ListView widget. -->

    <android.support.v4.view.ViewPager
        android:id="@+id/vp_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>

2.找到ViewPager并设置适配器

private void initViewPager() {
        // TODO 自动生成的方法存根
        mViewPager = (ViewPager) findViewById(R.id.vp_list);
        //得到设置好的view列表
        ArrayList<View> viewList = setListViewInVp();
        mViewPager.setAdapter(new ListViewPagerAdapter(viewList));
    }

适配器:

/**
     * @author:Jack Tony
     * @tips  :viewPager的适配器
     * @date  :2014-10-14
     */
    public class ListViewPagerAdapter extends PagerAdapter {
        //设置list数组,传入view
        private ArrayList<View> mViewList;
        private int pagerNum = 0;

        public ListViewPagerAdapter(ArrayList<View> viewList) {
            mViewList = viewList;
        }

        public int getPagerNum() {
            return pagerNum;
        }

        @Override
        public int getCount() {
            return mViewList.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public void destroyItem(View arg0, int position, Object object) {
            if (mViewList.get(position) != null) {
                ((ViewPager) arg0).removeView(mViewList.get(position));
            }
        }

        @Override
        public Object instantiateItem(View container, int position) {
            try {
                if (mViewList.get(position).getParent() == null) {
                    ((ViewPager) container).addView(mViewList.get(position), 0);
                } else {
                    /*
                     * 很难理解新添加进来的view会自动绑定一个父类,由于一个儿子view不能与两个父类相关,
                     * 所以得解绑不这样做否则会产生 viewpager java.lang.IllegalStateException:
                     * The specified child already has a parent. You must call
                     * removeView() on the child‘s parent first.
                     */
                    ((ViewGroup) mViewList.get(position).getParent())
                            .removeView(mViewList.get(position));
                    ((ViewPager) container).addView(mViewList.get(position), 0);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                pagerNum = position;
            }
            return mViewList.get(position);
        }

    }

3.开始设置要放入viewPager中的listView

布局文件:

layout_listview_in_viewpager.xml

<?xml version="1.0" encoding="utf-8"?>
<com.handmark.pulltorefresh.library.PullToRefreshListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ptr="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    ptr:ptrHeaderBackground="@android:color/darker_gray" />

java代码:

private ArrayList<View> setListViewInVp() {
        //设置给viewpager中填充的view列表
        ArrayList<View> viewList = new ArrayList<View>();
        //将string数组放入适配器中
        final String[] data = { "1", "2", "3","4", "5", "6", "7", "8", "9", "10", "11",
            "12", "13", "14", "15", "16", "17","18", "19", "20",  };
        ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_list_item_1, data);

        //找到listView的布局,生成可以下拉刷新的listView,添加到视图列表中
        LayoutInflater inflater = LayoutInflater.from(getApplication());
        for (int i = 0; i < 4; i++) {
            PullToRefreshListView plv = (PullToRefreshListView) inflater.inflate(
                    R.layout.layout_listview_in_viewpager,  null);
            plv.setAdapter(adapter);
            plv.setOnRefreshListener(new OnRefreshListener<ListView>() {

                @Override
                public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                    // TODO 自动生成的方法存根
                    new GetDataTask(refreshView).execute();
                }
            });

            viewList.add(plv);
        }
        return viewList;
    }

4.定义异步任务

private static class GetDataTask extends AsyncTask<Void, Void, Void> {

        PullToRefreshBase<?> mRefreshedView;

        public GetDataTask(PullToRefreshBase<?> refreshedView) {
            mRefreshedView = refreshedView;
        }

        @Override
        protected Void doInBackground(Void... params) {
            // Simulates a background job.
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            mRefreshedView.onRefreshComplete();
            super.onPostExecute(result);
        }
    }

MainActivity.java的全部代码

package com.example.ptrlistviewinviewpagertest;

import java.util.ArrayList;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshListView;

public class MainActivity extends Activity {

    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        // TODO 自动生成的方法存根
        initViewPager();
    }

    private void initViewPager() {
        // TODO 自动生成的方法存根
        mViewPager = (ViewPager) findViewById(R.id.vp_list);
        //得到设置好的view列表
        ArrayList<View> viewList = setListViewInVp();
        mViewPager.setAdapter(new ListViewPagerAdapter(viewList));
    }

    private ArrayList<View> setListViewInVp() {
        //设置给viewpager中填充的view列表
        ArrayList<View> viewList = new ArrayList<View>();
        //将string数组放入适配器中
        final String[] data = { "1", "2", "3","4", "5", "6", "7", "8", "9", "10", "11",
            "12", "13", "14", "15", "16", "17","18", "19", "20",  };
        ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_list_item_1, data);

        //找到listView的布局,生成可以下拉刷新的listView,添加到视图列表中
        LayoutInflater inflater = LayoutInflater.from(getApplication());
        for (int i = 0; i < 4; i++) {
            PullToRefreshListView plv = (PullToRefreshListView) inflater.inflate(
                    R.layout.layout_listview_in_viewpager,  null);
            plv.setAdapter(adapter);
            plv.setOnRefreshListener(new OnRefreshListener<ListView>() {

                @Override
                public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                    // TODO 自动生成的方法存根
                    new GetDataTask(refreshView).execute();
                }
            });

            viewList.add(plv);
        }
        return viewList;
    }

    /**
     * @author:Jack Tony
     * @tips  :viewPager的适配器
     * @date  :2014-10-14
     */
    public class ListViewPagerAdapter extends PagerAdapter {
        //设置list数组,传入view
        private ArrayList<View> mViewList;
        private int pagerNum = 0;

        public ListViewPagerAdapter(ArrayList<View> viewList) {
            mViewList = viewList;
        }

        public int getPagerNum() {
            return pagerNum;
        }

        @Override
        public int getCount() {
            return mViewList.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public void destroyItem(View arg0, int position, Object object) {
            if (mViewList.get(position) != null) {
                ((ViewPager) arg0).removeView(mViewList.get(position));
            }
        }

        @Override
        public Object instantiateItem(View container, int position) {
            try {
                if (mViewList.get(position).getParent() == null) {
                    ((ViewPager) container).addView(mViewList.get(position), 0);
                } else {
                    /*
                     * 很难理解新添加进来的view会自动绑定一个父类,由于一个儿子view不能与两个父类相关,
                     * 所以得解绑不这样做否则会产生 viewpager java.lang.IllegalStateException:
                     * The specified child already has a parent. You must call
                     * removeView() on the child‘s parent first.
                     */
                    ((ViewGroup) mViewList.get(position).getParent())
                            .removeView(mViewList.get(position));
                    ((ViewPager) container).addView(mViewList.get(position), 0);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                pagerNum = position;
            }
            return mViewList.get(position);
        }

    }

    private static class GetDataTask extends AsyncTask<Void, Void, Void> {

        PullToRefreshBase<?> mRefreshedView;

        public GetDataTask(PullToRefreshBase<?> refreshedView) {
            mRefreshedView = refreshedView;
        }

        @Override
        protected Void doInBackground(Void... params) {
            // Simulates a background job.
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            mRefreshedView.onRefreshComplete();
            super.onPostExecute(result);
        }
    }
}

源码下载:http://download.csdn.net/detail/shark0017/8036901

时间: 2024-10-03 06:36:32

Android PullToRefreshListView和ViewPager的结合使用的相关文章

android UI之ViewPager多页面滑动效果

  viewPager实现引导页 ViewPager多页面滑动效果 1.Android的左右滑动在实际编程经常能用到,比如查看多张图片,左右 切换tab页. 2.自android 3.0之后的SDK中提供了android-support-V4包用以实现 版本兼容,让老版本系统下的应用通过加入jar包实现扩展,其中有一 个可以实现左右滑动的类ViewPager 今天我们就用ViewPager类来实现引导页的实战案例 实现功能: 1.实现ViewPager多页面滑动效果. 2.下方的显示当前

Android开发之ViewPager

什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包. 通俗点来讲,就是现在市面上大多数app,安装完第一次打开软件会出现的一个左右滑动的引导界面. 布局代码: 要点1.页面的小圆点的控制,当在当前页时小圆点不可点. 所以有多少个页面就需要添加多少的圆点图片. 1 <RelativeLa

Android ActionBar与ViewPager合用

内容可以左右滑动,因为使用了ViewPager(我这里用了V4包) view_pager_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/viewPag

Android控件——ViewPager

摘要 ViewPager最早出自4.0版本,那么低版本如何能使用ViewPager呢?为了兼容低版本安卓设备,谷歌官方给我们提供了一个的软件包android.support.v4.view.这个V4包囊了只有在安卓3.0以上可以使用的api,而viewpager就是其中之一.利用它,我们可以做很多事情,从最简单的引导页导航,到轮转广告,到页面菜单等等,无不出现ViewPager的身影.应用广泛,简单好用,更好的交互性,这也是ViewPager一出现便大受程序员欢迎的原因.如此好用的控件,你是不是

Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View

最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View. 主要原理就是利用定时任务器定时切换ViewPager的页面. 效果图如下: 主页面布局实现如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&

Android源码:Android切换菜单(Viewpager+Fragme)

Android切换菜单(Viewpager+Fragme)                                                                                                                                                                支持平台:Android    运行环境:Eclipse    开发语言:Java                    

Android:使用ViewPager实现左右滑动切换图片(图上有点点)

在以下实例的基础上加上点点 Android:使用ViewPager实现左右滑动切换图片 (简单版) 效果预览: 因为要把点点放图片上,所以修改布局为相对布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=&

Android开发之ViewPager的简单使用

ViewPager是V4包中的,如果你的编译器敲不出ViewPager,那么你就需要添加,看下面: 第一步:点击+号 第二步:选择第一个Library 第三步:添加这个包: 然后点击ok-->ok就搞定了,编译器会从新进行预编译. 下面就是重点了,我们先看布局文件: 1 <android.support.v4.view.ViewPager 2 android:id="@+id/ViewPager" 3 android:layout_width="match_par

Android随笔--使用ViewPager实现简单地图片的左右滑动切换

Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布局都是相同的,如下只展示其中之一: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/