通用项目ViewPager的界面搭建

# 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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值