# BasePager抽取
ViewPager需要根据位置返回不同的界面,在instantiateItem方法里实现太复杂,所以抽取一个基类BasePager,拥有两个方法,initview方法负责创建布局,initdata方法负责更新数据
抽取过程
public Object instantiateItem(ViewGroup container, int position) {
/**
* 根据位置创建布局
* if(position==0){
* view.inflate(首页布局)
* }
* if(position==1){
* view.inflate(新闻中心布局)
* }
* 。。。
*
* 更新布局
* if(position==0){
* 更新首页布局
* }
* if(position==0){
* 更新新闻布局
* }
* 。。。
*
* Pager{
* initview()
* initdata()
* }
*
* new Homepager();
*
* if(position==0){
* homepager.iniview()
* }
* if(position==1){
* newspager.iniview()
* }
*
* if(position==0){
* homepager.initdata();
* }
* if(position==0){
* newspager.initdata();
* }
*
* List<Pager> pagers = new Arraylist<Pager>();
* pager.add(HomePager);
* pager.add(NewsPager);
*
* Pager pager = pagers.get(position)
* pager.initview();
* pager.initdata();
*
*/
// 根据位置获取相对应的Pager对象
BasePager pager = pagers.get(position);
// 获取Pager对象的布局
//View view = pager.initView();
View view = pager.rootView;
container.addView(view);
// 更新Pager对象的布局
// pager.initData(); 不在这个地方加载数据,防止ViewPager预加载时,浪费流量
return view;
}
给ViewPager准备5个界面对象
// 设置数据
pagers = new ArrayList<BasePager>();
pagers.add(new HomePager(mActivity));
pagers.add(new NewscenterPager(mActivity));
pagers.add(new SmartservicePager(mActivity));
pagers.add(new GovaffairsPager(mActivity));
pagers.add(new SettingPager(mActivity));
抽取的基类BasePager
public abstract class BasePager{
protected Context mContext;// 提供给子类使用的上下文对象
public View rootView;// 保存自己身上的布局
public BasePager(Context context){
this.mContext = context;
rootView = initView();
}
/**
* 让子类实现,返回具体的子类布局
* @return
*/
public abstract View initView();
/**
* 让子类更新布局,不必须实现
*/
public void initData(){
}
}
由于5个界面的布局有些类似,所以把共同的布局抽取到BasePager的initview方法中
布局文件是basepager.xml
public View initView(){
View view = View.inflate(mContext, R.layout.basepager, null);
tv_basepager_title = (TextView) view.findViewById(R.id.tv_basepager_title);
ib_basepager_menu = (ImageButton) view.findViewById(R.id.ib_basepager_menu);
fl_basepager_container = (FrameLayout) view.findViewById(R.id.fl_basepager_container);
//ViewUtils.inject(this, view);// 在抽象类里面不能使用ViewUtils注解找控件,因为内部使用的是getDeclaredFields
ib_basepager_menu.setOnClickListener(this);
return view;
}
子类在更新布局时只需要覆盖initdata方法
如HomePager:
public class HomePager extends BasePager {
public HomePager(Context context) {
super(context);
}
@Override
public void initData() {
System.out.println("首页加载数据了");
tv_basepager_title.setText("首页");
ib_basepager_menu.setVisibility(View.GONE);
TextView textView = new TextView(mContext);
textView.setText("首页");
textView.setGravity(Gravity.CENTER);
fl_basepager_container.removeAllViews();
fl_basepager_container.addView(textView);
}
}
为了避免ViewPager的预加载方法导致5个Pager对象会提前加载数据,所以需要监听ViewPager,在onPageSelected方法中加载数据
// 监听ViewPager,当选中某一页数据时,才加载数据
vp_content_pagers.setOnPageChangeListener(new MyOnPageChangeListener());
public void onPageSelected(int position) {
// 当选中某一页数据时,才加载数据
BasePager pager = pagers.get(position);
pager.initData();
}
# ViewPager关联RadioGroup
// 监听底部单选按钮
rg_content_bottom.setOnCheckedChangeListener(new MyOnCheckedChangeListener());
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_content_home:
vp_content_pagers.setCurrentItem(0,false);// 参数2 是否带滑动效果
enableSlidingMenu(false);
break;
case R.id.rb_content_newscenter:
vp_content_pagers.setCurrentItem(1,false);
enableSlidingMenu(true);
break;
case R.id.rb_content_smartservice:
vp_content_pagers.setCurrentItem(2,false);
enableSlidingMenu(true);
break;
case R.id.rb_content_govaffairs:
vp_content_pagers.setCurrentItem(3,false);
enableSlidingMenu(true);
break;
case R.id.rb_content_setting:
vp_content_pagers.setCurrentItem(4,false);
enableSlidingMenu(false);
break;
default:
break;
}
// 根据底部单选按钮的位置,禁用侧滑菜单
private void enableSlidingMenu(boolean enable){
MainUI mainUI = (MainUI) mActivity;
SlidingMenu slidingMenu = mainUI.getSlidingMenu();
if(enable){
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}else{
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
# 去掉最外层ViewPager的滑动事件功能
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
// 干掉处理事件的默认行为
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
}
在布局文件中使用自己NoScrollViewPager
content_fragment.xml中
<cn.itheima.zhbj87.view.NoScrollViewPager
android:id="@+id/vp_content_pagers"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
# 新闻中心访问网络
Xutils访问网络,加网络权限
private void getDataFromServer() {
HttpUtils httpUtils = new HttpUtils();
// 参数1 访问网络的方式 get 异步方法; T 代表的是访问网络回来的数据类型
httpUtils.send(HttpMethod.GET, ConstantUtil.NEWSCENTER_URL, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
System.out.println("访问新闻中心成功:" + responseInfo.result);
parseJson(responseInfo.result);
}
@Override
public void onFailure(HttpException error, String msg) {
System.out.println("访问新闻中心失败");
}
});
}
优化项目url
public class ConstantUtil {
/**
* 服务器项目地址
*/
public static final String SERVER_URL = "http://10.0.2.2:8080/zhbj";
/**
* 新闻中心地址
*/
public static final String NEWSCENTER_URL = SERVER_URL + "/categories.json";
}
# 解析json
使用Gson解析json
protected void parseJson(String result) {
// 使用gson 解析json
Gson gson = new Gson();
NewscenterBean newscenterBean = gson.fromJson(result, NewscenterBean.class);
}
# 左上角菜单按钮控制侧滑菜单开关
在BasePager里
@Override
public void onClick(View v) {
MainUI mainUI = (MainUI) mContext;
mainUI.getSlidingMenu().toggle();
}
ViewPager需要根据位置返回不同的界面,在instantiateItem方法里实现太复杂,所以抽取一个基类BasePager,拥有两个方法,initview方法负责创建布局,initdata方法负责更新数据
抽取过程
public Object instantiateItem(ViewGroup container, int position) {
/**
* 根据位置创建布局
* if(position==0){
* view.inflate(首页布局)
* }
* if(position==1){
* view.inflate(新闻中心布局)
* }
* 。。。
*
* 更新布局
* if(position==0){
* 更新首页布局
* }
* if(position==0){
* 更新新闻布局
* }
* 。。。
*
* Pager{
* initview()
* initdata()
* }
*
* new Homepager();
*
* if(position==0){
* homepager.iniview()
* }
* if(position==1){
* newspager.iniview()
* }
*
* if(position==0){
* homepager.initdata();
* }
* if(position==0){
* newspager.initdata();
* }
*
* List<Pager> pagers = new Arraylist<Pager>();
* pager.add(HomePager);
* pager.add(NewsPager);
*
* Pager pager = pagers.get(position)
* pager.initview();
* pager.initdata();
*
*/
// 根据位置获取相对应的Pager对象
BasePager pager = pagers.get(position);
// 获取Pager对象的布局
//View view = pager.initView();
View view = pager.rootView;
container.addView(view);
// 更新Pager对象的布局
// pager.initData(); 不在这个地方加载数据,防止ViewPager预加载时,浪费流量
return view;
}
给ViewPager准备5个界面对象
// 设置数据
pagers = new ArrayList<BasePager>();
pagers.add(new HomePager(mActivity));
pagers.add(new NewscenterPager(mActivity));
pagers.add(new SmartservicePager(mActivity));
pagers.add(new GovaffairsPager(mActivity));
pagers.add(new SettingPager(mActivity));
抽取的基类BasePager
public abstract class BasePager{
protected Context mContext;// 提供给子类使用的上下文对象
public View rootView;// 保存自己身上的布局
public BasePager(Context context){
this.mContext = context;
rootView = initView();
}
/**
* 让子类实现,返回具体的子类布局
* @return
*/
public abstract View initView();
/**
* 让子类更新布局,不必须实现
*/
public void initData(){
}
}
由于5个界面的布局有些类似,所以把共同的布局抽取到BasePager的initview方法中
布局文件是basepager.xml
public View initView(){
View view = View.inflate(mContext, R.layout.basepager, null);
tv_basepager_title = (TextView) view.findViewById(R.id.tv_basepager_title);
ib_basepager_menu = (ImageButton) view.findViewById(R.id.ib_basepager_menu);
fl_basepager_container = (FrameLayout) view.findViewById(R.id.fl_basepager_container);
//ViewUtils.inject(this, view);// 在抽象类里面不能使用ViewUtils注解找控件,因为内部使用的是getDeclaredFields
ib_basepager_menu.setOnClickListener(this);
return view;
}
子类在更新布局时只需要覆盖initdata方法
如HomePager:
public class HomePager extends BasePager {
public HomePager(Context context) {
super(context);
}
@Override
public void initData() {
System.out.println("首页加载数据了");
tv_basepager_title.setText("首页");
ib_basepager_menu.setVisibility(View.GONE);
TextView textView = new TextView(mContext);
textView.setText("首页");
textView.setGravity(Gravity.CENTER);
fl_basepager_container.removeAllViews();
fl_basepager_container.addView(textView);
}
}
为了避免ViewPager的预加载方法导致5个Pager对象会提前加载数据,所以需要监听ViewPager,在onPageSelected方法中加载数据
// 监听ViewPager,当选中某一页数据时,才加载数据
vp_content_pagers.setOnPageChangeListener(new MyOnPageChangeListener());
public void onPageSelected(int position) {
// 当选中某一页数据时,才加载数据
BasePager pager = pagers.get(position);
pager.initData();
}
# ViewPager关联RadioGroup
// 监听底部单选按钮
rg_content_bottom.setOnCheckedChangeListener(new MyOnCheckedChangeListener());
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_content_home:
vp_content_pagers.setCurrentItem(0,false);// 参数2 是否带滑动效果
enableSlidingMenu(false);
break;
case R.id.rb_content_newscenter:
vp_content_pagers.setCurrentItem(1,false);
enableSlidingMenu(true);
break;
case R.id.rb_content_smartservice:
vp_content_pagers.setCurrentItem(2,false);
enableSlidingMenu(true);
break;
case R.id.rb_content_govaffairs:
vp_content_pagers.setCurrentItem(3,false);
enableSlidingMenu(true);
break;
case R.id.rb_content_setting:
vp_content_pagers.setCurrentItem(4,false);
enableSlidingMenu(false);
break;
default:
break;
}
// 根据底部单选按钮的位置,禁用侧滑菜单
private void enableSlidingMenu(boolean enable){
MainUI mainUI = (MainUI) mActivity;
SlidingMenu slidingMenu = mainUI.getSlidingMenu();
if(enable){
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}else{
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
# 去掉最外层ViewPager的滑动事件功能
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
// 干掉处理事件的默认行为
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
}
在布局文件中使用自己NoScrollViewPager
content_fragment.xml中
<cn.itheima.zhbj87.view.NoScrollViewPager
android:id="@+id/vp_content_pagers"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
# 新闻中心访问网络
Xutils访问网络,加网络权限
private void getDataFromServer() {
HttpUtils httpUtils = new HttpUtils();
// 参数1 访问网络的方式 get 异步方法; T 代表的是访问网络回来的数据类型
httpUtils.send(HttpMethod.GET, ConstantUtil.NEWSCENTER_URL, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
System.out.println("访问新闻中心成功:" + responseInfo.result);
parseJson(responseInfo.result);
}
@Override
public void onFailure(HttpException error, String msg) {
System.out.println("访问新闻中心失败");
}
});
}
优化项目url
public class ConstantUtil {
/**
* 服务器项目地址
*/
public static final String SERVER_URL = "http://10.0.2.2:8080/zhbj";
/**
* 新闻中心地址
*/
public static final String NEWSCENTER_URL = SERVER_URL + "/categories.json";
}
# 解析json
使用Gson解析json
protected void parseJson(String result) {
// 使用gson 解析json
Gson gson = new Gson();
NewscenterBean newscenterBean = gson.fromJson(result, NewscenterBean.class);
}
# 左上角菜单按钮控制侧滑菜单开关
在BasePager里
@Override
public void onClick(View v) {
MainUI mainUI = (MainUI) mContext;
mainUI.getSlidingMenu().toggle();
}