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

来源:互联网 发布:用平板怎么看淘宝直播 编辑:程序博客网 时间:2024/04/29 20:42

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 PageAdapterPageIndicator *****

// 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 = newBasePageAdapter(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);

    }

 

/* 加载分类listtask */

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内部,你很可能想要使用一个更具体的实现,如---FragmentPagerAdapterFragmentStatePagerAdapter---。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显示 清空ViewPagerPageAdapter操作

        @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>)作为参数传递到此方法中,清空和更新适配器的数据内容,通知ViewPagerPageIndicator更新显示的内容(更新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();

        }

}                 

0 0
原创粉丝点击