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 = 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);
}
/* 加载分类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();
}
}