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、 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();
}
}
- Eoe客户端源码分析---ViewPager、 PageAdapter和PageIndicator 的使用
- Eoe客户端源码分析---SlidingMenu的使用
- ScrollContainer和PageIndicator的使用
- ViewPager和PageAdapter,FragmentPageAdapter,FragmentStatePageFragment
- EOE客户端阅读和项目的问题
- ViewPager无限循环,自动滚动,兼容PageIndicator的ViewPager
- android ViewPager 指示器 PageIndicator
- ViewPager适配器学习记录( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))
- ViewPager适配器学习记要( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))
- ViewPager适配器学习记要( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))
- ViewPager适配器学习记录( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))
- ViewPager适配器学习记录( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))
- 有关Viewpager 在pageAdapter中调用notifyDataSetChanged失效的问题
- 【Android API】3.ViewPager的实现原理和源码分析
- 如何使用Github参与开源项目(以eoe的Android客户端为例)
- eoe android客户端源码剖析(一)动画启动界面
- PageAdapter使用时?
- android eoe客户端
- C#使用Monitor类、Lock、Mutex和Semaphore进行多线程同步
- 安卓WebView报错:android uncaught typeerror object object object has no method
- 序列化是的作用和用途
- html meta 参数详解
- Android 实现线程的方法
- Eoe客户端源码分析---ViewPager、 PageAdapter和PageIndicator 的使用
- 完美解读Linux中文件系统的目录结构
- 嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX
- poj 1664 小苹果(递推)
- POJ-3617 Best Cow Line
- ARM的六大类指令集--- 加载/存储指令
- eclipse maven插件的最新地址
- ffmpeg无法定位序数3751于动态链接库avcodec-55.dll上
- MySQL 5.6.19 二进制的安装方式