您的位置:首页 > 移动开发 > Android开发

Eoe客户端源码分析---ViewPager、 PageAdapter和PageIndicator 的使用

2014-06-27 17:12 531 查看
ViewPager、 PageAdapter和PageIndicator 的使用

Eoe客户端源码注释[通过ViewPager和PageIndicator显示数据]

(0)初始化Dao

private
void
initClass() {
        blogsDao = new BlogsDao(this);//社区博客
        newsDao = new NewsDao(this);//新闻资讯
        wikiDao = new WikiDao(this);//学习教程
        topDao = new TopDao(this);//社区精选
}

(1)初始化ViewPager和PageIndicator;

并设置ViewPager和PageIndicator相关联;

//*****ViewPager、 PageAdapter和PageIndicator *****

// views
    private ViewPagermViewPager;
    private BasePageAdaptermBasePageAdapter;
private PageIndicator
mIndicator;

//page content (ViewPager)

mViewPager = (ViewPager) findViewById(R.id.above_pager);

//page title (PageIndictor)

mIndicator = (PageIndicator)findViewById(R.id.above_indicator);
private
void
initViewPager() {
//ViewPager的adapter
        mBasePageAdapter =
new
BasePageAdapter(MainActivity.this);
        mViewPager.setOffscreenPageLimit(0);
        mViewPager.setAdapter(mBasePageAdapter);
        //设置ViewPager与PageIndicator相关联
        mIndicator.setViewPager(mViewPager);
       //关联之后,要对ViewPager进行监听,用indicator设置就行了
        mIndicator.setOnPageChangeListener(newMyPageChangeListener());
      //在UI thread中调用AysncTask类的execute()方法  执行异步任务
        new MyTask().execute(topDao);
    }

 

/* 加载分类list的task */
publicclass MyTaskextendsAsyncTask<BaseDao, String, Map<String, Object>>{

}

(2)PageIndicator和ViewPager页面布局文件

<cn.eoe.app.indicator.TitlePageIndicator/>
<android.support.v4.view.ViewPager/>

FrameLayout:

 

 


TitlePageIndicator

layout_width

wrap_content
fill_parent
wrap_content
layout_gravity

left|center_vertical

Center
right|center_vertical

above_slidingmenu.xml

<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/back_above_second_title" >

<!--  向左  指示符  gone(隐藏) -->
<ImageView
android:id="@+id/imageview_above_left"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="left|center_vertical"
android:src="@drawable/dis_indicate_left"
android:visibility="gone" />
<!-- 向右  指示符  -->
<ImageView
android:id="@+id/imageview_above_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right|center_vertical"
android:src="@drawable/dis_indicate_right" />

<!-- 页面导航 (1.显示当前页标题  上一页 和  下一页标题) -->
<!--  (2.当滚动页面时   导航标题也跟着改变  ) -->
<cn.eoe.app.indicator.TitlePageIndicator
android:id="@+id/above_indicator"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#666"
app:selectedColor="#666" />
</FrameLayout>


!-- 页面内容    默认隐藏-->
<android.support.v4.view.ViewPager
android:id="@+id/above_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f5f5f5"
android:visibility="gone" />


(3)页面切换的监听函数

/**viewPager切换页面*/
    class MyPageChangeListenerimplementsOnPageChangeListener {
        @Override
        public
void
onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public
void
onPageScrolled(int arg0,float arg1,int arg2) {
            // TODO Auto-generated method stub
        }
        @Override
        public
void
onPageSelected(int arg0) {
            // TODO Auto-generated method stub
            if (arg0 == 0) {//切换到第一个ViewPager
/*//设置SlidingMenu 的手势模式   
TOUCHMODE_FULLSCREEN 全屏模式,在整个content页面中滑动都可以打开SlidingMenu;   
TOUCHMODE_MARGIN 边缘模式,在content页面中如果想打开SlidingMenu,你需要在屏幕边缘滑动才可以打开SlidingMenu。   */
        getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
                imgLeft.setVisibility(View.GONE);
            } else
if
(arg0 ==mBasePageAdapter.mFragments.size() - 1) {
//切换到最后一个ViewPager
                imgRight.setVisibility(View.GONE);
                getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
            } else {//切换到中间(非头尾)的ViewPager
                imgRight.setVisibility(View.VISIBLE);
                imgLeft.setVisibility(View.VISIBLE);
                getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
            }
        }
    }

(4)ViewPager的适配器BasePageAdapter的实现:

(ViewPager的适配器是PagerAdapter,它是基类提供适配器来填充页面ViewPager内部,你很可能想要使用一个更具体的实现,如---FragmentPagerAdapter或FragmentStatePagerAdapter---。FragmentPagerAdapter更多的用于少量界面的ViewPager,比如Tab。要注意的是FragmentStatePagerAdapter可能不经意间会造成内存未正常回收,严重导致内存溢出,比如图片资源没有释放,资源引用问题。

)

继承FragmentStatePagerAdapter以及重写部分方法的使用

BasePageAdapter.java                        

//addFragment(pagerTitle,ViewPagerContent)

public class BasePageAdapter extends FragmentStatePagerAdapter{

 

public ArrayList<Fragment>mFragments =new ArrayList<Fragment>();;
public List<CategorysEntity>tabs =new ArrayList<CategorysEntity>();

 

public
void
addFragment(List<CategorysEntity> mList,List<Object> listObject) {
       tabs.addAll(mList);
       for (int i = 0; i < listObject.size(); i++) {
           Object object = listObject.get(i);
           if (objectinstanceof NewsCategoryListEntity) {
              addTab(new NewsFragment(mActivity,
                     ((NewsCategoryListEntity) listObject.get(i))));
           } else
if
(object instanceof BlogsCategoryListEntity) {
              addTab(new BlogFragment(mActivity,
                     ((BlogsCategoryListEntity) listObject.get(i))));
           } else
if
(object instanceof WikiCategoryListEntity) {
              addTab(new WikiFragment(mActivity,
                     ((WikiCategoryListEntity) listObject.get(i))));
           }
       }
    }

 

public
void
addTab(Fragment fragment) {
       mFragments.add(fragment);
       notifyDataSetChanged();
    }

//1.获取每一个ViewPager要显示的标题(PageIndicator显示的内容)

@Override
    publicCharSequence getPageTitle(int position) {
       returntabs.get(position).getName();
    }
//2.获取每一个ViewPager要显示的具体内容(ViewPager的内容)
    @Override
    publicFragment getItem(int arg0) {
       returnmFragments.get(arg0);
    }
    @Override
    publicint getCount() {
       returnmFragments.size();
    }

}

 

(5)在MainActivity中更新适配器数据

思路:

01.从Dao对象中获取数据,存放在Map集合中

02.设置PageAdapter为Map集合中的数据

调用自定义的BasePagerAdapter的AddFragment方法,传入要显示的页面标题和页面数据,其中AddFragment会调用addTab方法(添加每个ViewPager显示的Fragment,每添加一个Fragment就会调用notifyDataSetChanged()方法刷新数据)

//使用轻量级的异步类AsyncTask实现分类list的加载     

//启动任务执行的输入参数类型为BaseDao;

//后台执行任务的返回结果为Map<String,Object>

public
class
MyTask extends AsyncTask<BaseDao, String, Map<String,Object>> {
        private
boolean
mUseCache;
        public MyTask() {
            mUseCache =
true
;
        }
        public MyTask(boolean useCache) {
            mUseCache = useCache;
        }
       //执行后台任务前 设置UI显示 清空ViewPager和PageAdapter等操作
        @Override
        protected
void
onPreExecute() {
            // TODO Auto-generated method stub
            imgLeft.setVisibility(View.GONE);
            imgRight.setVisibility(View.GONE);
            loadLayout.setVisibility(View.VISIBLE);
            mViewPager.setVisibility(View.GONE);
            mViewPager.removeAllViews();
            mBasePageAdapter.Clear();
   //隐藏菜单
            MainActivity.this.showContent();
            super.onPreExecute();
            isShowPopupWindows =false;
        }
       //接收输入参数(Dao对象),返回计算结果(map<页面标题,页面数据>)
        @Override
        protected Map<String, Object>doInBackground(BaseDao... params) {
            BaseDao dao = params[0];
            List<CategorysEntity>categorys = new ArrayList<CategorysEntity>();
            Map<String, Object> map = new HashMap<String,Object>();
            if (daoinstanceof TopDao) {
                mTag = 0;
                if ((categoryList =topDao.mapperJson(mUseCache)) !=null)
{
                    categorys = topDao.getCategorys();
                    map.put("tabs",categorys);
                    map.put("list",categoryList);
                }
            } else
if
(dao instanceof BlogsDao) {
                mTag = 3;
                if ((responseData =blogsDao.mapperJson(mUseCache)) !=null)
{
                    categoryList =(List)responseData.getList();
                    categorys = responseData.getCategorys();
                  //精选博客推荐博客最热博客
                    map.put("tabs",categorys);
                  //所有的博客文章
                    map.put("list",categoryList);
                }
            } else
if
(dao instanceof NewsDao) {
                mTag = 1;
                if ((newsResponseData =newsDao.mapperJson(mUseCache)) !=null)
{
                    categoryList =(List)newsResponseData.getList();
                    categorys = newsResponseData.getCategorys();
                    map.put("tabs",categorys);
                    map.put("list",categoryList);
                }
            } else
if
(dao instanceof WikiDao) {
                mTag = 2;
                if ((wikiResponseData =wikiDao.mapperJson(mUseCache)) !=null)
{
                    categoryList =(List)wikiResponseData.getList();
                    categorys = wikiResponseData.getCategorys();
                    map.put("tabs",categorys);
                    map.put("list",categoryList);
                }
            } else {
                returnnull;
            }
            return map;
        }
       //将计算结果(Map<String,Object>)作为参数传递到此方法中,清空和更新适配器的数据内容,通知ViewPager和PageIndicator更新显示的内容(更新UI组件)
        @Override
        protected
void
onPostExecute(Map<String, Object>result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            isShowPopupWindows =true;
            mBasePageAdapter.Clear();
            mViewPager.removeAllViews();
            if (!result.isEmpty()) {
                mBasePageAdapter.addFragment((List) result.get("tabs"),
                       (List) result.get("list"));
                imgRight.setVisibility(View.VISIBLE);
                loadLayout.setVisibility(View.GONE);
                loadFaillayout.setVisibility(View.GONE);
            } else {
                mBasePageAdapter.addNullFragment();
                loadLayout.setVisibility(View.GONE);
                loadFaillayout.setVisibility(View.VISIBLE);
            }
            mViewPager.setVisibility(View.VISIBLE);
            mBasePageAdapter.notifyDataSetChanged();
            mViewPager.setCurrentItem(0);//当前显示第一个Pager
            mIndicator.notifyDataSetChanged();
        }
}                 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息