您的位置:首页 > 移动开发 > Android开发

ViewPager+Fragment+广播来实现一个滑动页面切换

2015-01-30 17:43 176 查看


要实现这样一个页面,上面的好说,下面的是一个滑动视图,我们想到的是用viewpager来实现,但是这个有一个问题,按照平时的写法,我们会写5个Activity放到viewpager里面去,这自然是可以实现的。但是这里有一个问题,一进来,在主界面manager.startActivity(id, intent).getDecorView();来取得view加到viewpager里,这样一启动,五个子界面都同时启动,都去加载数据,会导致很卡,也浪费了资源,我们想法是,默认只加载第一个页面,滑到第二个才开始加载第二个的数据,但是通过监听事件发现,一开始启动,五个Activity的oncreate方法都运行了。再滑动切换,是没有任何监听或者实现方法得到调用的。

这里后来想到了另外一个方法:我们用viewpager+5个Fragment+广播机制去通知他更新。

在主界面我们可以这样写。

/**
* 初始化PageViewer
*/
List<Fragment> list;
FragmentPagerAdapter myPagerAdapter;
FragmentManager SupportfragmentManager = getSupportFragmentManager();
private void initPagerViewer(){
Label1AllOrder lable1 = new Label1AllOrder();
Label2WinPrizeOrder lable2 = new Label2WinPrizeOrder();
Label3WaitForLotteryOrder lable3 = new Label3WaitForLotteryOrder();
Label4ZhuiHaoOrder lable4 = new Label4ZhuiHaoOrder();
Label5BuyTogetherOrder lable5 = new Label5BuyTogetherOrder();

list = new ArrayList<Fragment>();
list.add(lable1);
list.add(lable2);
list.add(lable3);
list.add(lable4);
list.add(lable5);

myPagerAdapter = new MyPagerAdapter(SupportfragmentManager);
view_pager.setAdapter(myPagerAdapter);
view_pager.setOnPageChangeListener(new MyOnPageChangeListener());
}

/**
* Pager适配器
*/
public class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int arg0) {
return list.get(arg0);
}

@Override
public int getCount() {
return list.size();
}

/*@Override
public Object instantiateItem(View arg0, int arg1) {
//ViewPager pViewPager = ((ViewPager) arg0);
//pViewPager.addView(list.get(arg1).getView());
return list.get(arg1);
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//ViewPager pViewPager = ((ViewPager) container);
//pViewPager.removeView(list.get(position).getView());
}*/
}

private void sendBroadcastDoRefreshByCurrentIndex(){
switch (currentIndex) {
case 0:
sendBroadcastDoRefresh("action.Label1AllOrder");
break;
case 1:
sendBroadcastDoRefresh("action.Label2WinPrizeOrder");
break;
case 2:
sendBroadcastDoRefresh("action.Label3WaitForLotteryOrder");
break;
case 3:
sendBroadcastDoRefresh("action.Label4ZhuiHaoOrder");
break;
case 4:
sendBroadcastDoRefresh("action.Label5BuyTogetherOrder");
break;
default:
break;
}
}

Intent broadCastIntent = new Intent();
// 广播通知
private void sendBroadcastDoRefresh(String action){
broadCastIntent.setAction(action);
sendBroadcast(broadCastIntent);
}

/**
* 页卡切换监听
*/

private int currentIndex = 0;
public class MyOnPageChangeListener implements OnPageChangeListener {
@Override
public void onPageSelected(int index) {
currentIndex = index;
System.out.println("-onPageSelected--------" + index);
initViewPagePoint(index);
switch (index) {
case 0:
sendBroadcastDoRefresh("action.Label1AllOrder");
view_pager_tip.setText("全部订单");
break;
case 1:
sendBroadcastDoRefresh("action.Label2WinPrizeOrder");
view_pager_tip.setText("中奖订单");
break;
case 2:
sendBroadcastDoRefresh("action.Label3WaitForLotteryOrder");
view_pager_tip.setText("待开奖订单");
break;
case 3:
sendBroadcastDoRefresh("action.Label4ZhuiHaoOrder");
view_pager_tip.setText("追号订单");
break;
case 4:
sendBroadcastDoRefresh("action.Label5BuyTogetherOrder");
view_pager_tip.setText("合买订单");
break;
default:
break;
}
}

@Override
public void onPageScrollStateChanged(int arg0) {

}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {

}
}

每滑动一下,就发送广播,通知子界面去更新。但是是不是每次更新就有他自己控制了
在五个子Fragment我们可以这样写:其实这里五个是相似了。我就贴一个的代码

public class Label2WinPrizeOrder extends Fragment implements OnClickListener {
Activity activity = Label2WinPrizeOrder.this.getActivity();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

LayoutInflater inflater = getActivity().getLayoutInflater();
mainView = inflater.inflate(R.layout.my_lottery_user_center_label2_win_prize, (ViewGroup)getActivity().findViewById(R.id.my_lottery_user_center_viewpage), false);

initUI();

initNoDataUI();

//注册刷新广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("action.Label2WinPrizeOrder");
getActivity().registerReceiver(mRefreshBroadcastReceiver, intentFilter);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup p = (ViewGroup) mainView.getParent();
if(p!=null){
p.removeAllViewsInLayout();
}

return mainView;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}

// broadcast receiver
private BroadcastReceiver mRefreshBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("action.Label2WinPrizeOrder")) {
System.out.println("---------------action.Label2WinPrizeOrder");

if (AutoUpdate.isNetworkAvailable(activity)) {
if(canLoadAgain){
loadingRelativelayout.setVisibility(View.VISIBLE);
noDataLinearlayout.setVisibility(View.GONE);
hasDataLinearlayout.setVisibility(View.GONE);

updateInitLotteryInfo();

page = 0;
mListView.mEndRootView.setVisibility(View.GONE);
mListView.setAutoLoadMore(true);
mListView.setCanRefresh(true);
new getDataTask().execute(1);
}
}

setK3ballVisible();
}
}
};

//初设化彩种信息
private void updateInitLotteryInfo(){
if(MyLotterActivity.labelsListData != null && MyLotterActivity.labelsListData.size() >= 2){
MyLotteryLabelBean bean = MyLotterActivity.labelsListData.get(1);
if(FunctionUtil.strNotNull(bean.getLottery_type_index())){
if("308".equals(bean.getLottery_type_index())){
lottery_type_index = 308;
}else if("309".equals(bean.getLottery_type_index())){
lottery_type_index = 309;
}else if("310".equals(bean.getLottery_type_index())){
lottery_type_index = 310;
}
}

if(FunctionUtil.strNotNull(bean.getTitle())){
title = bean.getTitle();
}

tipTextview.setText(title);
}
}

private void initUI() {
activity = getActivity();
loadingRelativelayout = (LinearLayout) mainView.findViewById(R.id.my_lottery_user_center_label2_loading_rel);
loadAgainRelativelayout = (RelativeLayout) mainView.findViewById(R.id.my_lottery_user_center_label2_load_again_rel);
hasDataLinearlayout = (LinearLayout) mainView.findViewById(R.id.my_lottery_user_center_label2_has_data_linear);
noDataLinearlayout = (LinearLayout) mainView.findViewById(R.id.my_lottery_user_center_label2_no_data_linear);
<span style="white-space:pre">	</span>}
}
 
这样。我们每次滑动一次就能在五个子类,得到一次广播通知。就让他去加载数据,当第二次在滑动到那个,他依然可以收到广播,至于要不要再去刷新数据,就看你怎么控制了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息