您的位置:首页 > 其它

智慧北京:新闻中心菜单切换的实现

2016-11-04 17:07 225 查看
实现:点击菜单选项,页面进行相应的跳转

步骤:1、原来在NewsCenterTabController里面设置的假数据“textView”需要删除,因为跳转时view不唯一,所以我们需要加一个空的容器,还是采用MVC架构。数据–>List mMenuControllers;

2、设置基类MenuController(模仿之前的tabController),再设置4个Controller的具体内容;

3、再将这些Controller添加到mMenuControllers,数据–>Controller;

4、将View加载进来(设置加载默认的第一个View),设置switchMenu()方法;里面要实现加载视图和加载数据。

加载视图前需要清空容器mContainer.removeAllViews();

5、制作菜单的点击事件:MenuFragment中:内容变化+菜单收起;

6、内容变化功能的实现:(在MenuFragment需要获取ContentFragment的内容,进而对它的子类进行操作)获得当前点击的页面,调用switchMenu()方法来加载视图,顺便在基类TabController加个switchMenu()方法供复写;

7、菜单收起:ui.getSlidingMenu().toggle();

8、设置当前选中的菜单项,mCurrentMenu = position;

同时UI刷新–>adapter.notifyDataSetChanged();



NewsCenterTabController

package huaxa.it.zhihuidemo.base.tab;

import java.util.ArrayList;
import java.util.List;

import com.google.gson.Gson;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;

import android.content.Context;
import android.drm.ProcessedData;
import android.graphics.Color;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import huaxa.it.zhihuidemo.MainUI;
import huaxa.it.zhihuidemo.base.TabController;
import huaxa.it.zhihuidemo.bean.NewsCenterBean;
import huaxa.it.zhihuidemo.bean.NewsCenterBean.NewsCenterMenuBean;
import huaxa.it.zhihuidemo.fragment.MenuFragment;
import huaxa.it.zhihuidemo.newscenter.MenuController;
import huaxa.it.zhihuidemo.newscenter.tab.MenuControllerHuDong;
import huaxa.it.zhihuidemo.newscenter.tab.MenuControllerNews;
import huaxa.it.zhihuidemo.newscenter.tab.MenuControllerZhuanTi;
import huaxa.it.zhihuidemo.newscenter.tab.MenuControllerZuTu;
import huaxa.it.zhihuidemo.utils.Constans;

/**
*
* @项目名: ZhiHuiDemo
* @包名: huaxa.it.zhihuidemo.base.tab
* @类名: NewsCenterTabController
* @创建者: 黄夏莲
* @创建时间: 2016年10月9日 ,上午7:29:31
*
* @描述: 新闻中心对应的controller
*/

public class NewsCenterTabController extends TabController
{

// private TextView text;
private List<MenuController>    mMenuControllers;
private FrameLayout             mContainer;
private String                  TAG = "TAG";

……

/**
* 数据处理
*
* @param json
*/
private void ProcessData(String json)
{
// 1、json解析 String ----> Object
Gson gson = new Gson();
// 第二个参数指的是要转换成的类型,JavaBean的类型
NewsCenterBean bean = gson.fromJson(json, NewsCenterBean.class);

List<NewsCenterMenuBean> mMenuDatas = bean.data;
String title = bean.data.get(0).children.get(0).title;
// 校验一下
Log.i(TAG, "校验" + title);

// 2、将Model设置给View(Model--->View)
// 2-1给菜单加载数据
MenuFragment menuFragment = ((MainUI) mContext).getMenuFragment();
menuFragment.setData(mMenuDatas);

// 2-2给自己的内容实体加载数据
mMenuControllers = new ArrayList<MenuController>();
mMenuControllers.add(new MenuControllerNews(mContext));// 新闻菜单
mMenuControllers.add(new MenuControllerZhuanTi(mContext));// 专题菜单
mMenuControllers.add(new MenuControllerZuTu(mContext));// 组图菜单
mMenuControllers.add(new MenuControllerHuDong(mContext));// 互动菜单
// 加载默认的第一个View
switchMenu(0);
}

@Override
public void switchMenu(int position)
{
// 清空容器
mContainer.removeAllViews();

MenuController menuController = mMenuControllers.get(position);
// 加载视图
View rootView = menuController.getRootView();
mContainer.addView(rootView);
// 加载数据
menuController.initData();
}
}


MenuController

package huaxa.it.zhihuidemo.newscenter;

import android.content.Context;
import android.view.View;

/**
* @项目名: ZhiHuiDemo
* @包名: huaxa.it.zhihuidemo.newscenter
* @类名: NewsCenterMenuNews
* @创建者: 黄夏莲
* @创建时间: 2016年10月18日 ,下午9:52:09
*
* @描述: 新闻页面的菜单的控制器
*/
public abstract class MenuController
{
protected View      mRootView;
protected Context   mContext;

public MenuController(Context context)
{
this.mContext = context;
mRootView = initView(context);
}

/**
* 初始化View
*
* @return
*/
protected abstract View initView(Context context);

/**
* 获得根视图
*
* @return
*/
public View getRootView()
{
return mRootView;// 将View暴露出去
}

/**
* 初始化数据
*
* @return
*/
public void initData()
{

}

/**
* 获取上下文
*
* @return
*/
public Context getContext()
{
return mContext;
}
}


各个Controller

如:

MenuControllerHuDong

package huaxa.it.zhihuidemo.newscenter.tab;

import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import huaxa.it.zhihuidemo.newscenter.MenuController;

/**
*
* @项目名:     ZhiHuiDemo
* @包名:         huaxa.it.zhihuidemo.newscenter.tab
* @类名:         MenuControllerHuDong
* @创建者:     黄夏莲
* @创建时间: 2016年10月18日 ,下午10:17:01
*
* @描述:          新闻中心中,互动菜单对应的控制器
*/
public class MenuControllerHuDong extends MenuController
{
private TextView    tv;

public MenuControllerHuDong(Context context)
{
super(context);
// TODO Auto-generated constructor stub
}

@Override
protected View initView(Context context)
{
tv = new TextView(context);

tv.setTextColor(Color.RED);
tv.setTextSize(24);
tv.setGravity(Gravity.CENTER);
return tv;
}

public void initData(){
tv.setText("新闻中心中,互动菜单的内容");
}

}


MenuControllerNews

package huaxa.it.zhihuidemo.newscenter.tab;

import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import huaxa.it.zhihuidemo.newscenter.MenuController;

/**
* @项目名: ZhiHuiDemo
* @包名: huaxa.it.zhihuidemo.newscenter.tab
* @类名: MenuControllerNews
* @创建者: 黄夏莲
* @创建时间: 2016年10月18日 ,下午10:05:42
*
* @描述: 新闻中心中,新闻菜单对应的控制器
*/
public class MenuControllerNews extends MenuController
{
private TextView    tv;

public MenuControllerNews(Context context)
{
super(context);
// TODO Auto-generated constructor stub
}

@Override
protected View initView(Context context)
{
tv = new TextView(context);

tv.setTextColor(Color.RED);
tv.setTextSize(24);
tv.setGravity(Gravity.CENTER);
return tv;
}

public void initData(){
tv.setText("新闻中心中,新闻菜单的内容");
}

}


MenuControllerZhuanTi

package huaxa.it.zhihuidemo.newscenter.tab;

import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import huaxa.it.zhihuidemo.newscenter.MenuController;

/**
*
* @项目名:     ZhiHuiDemo
* @包名:         huaxa.it.zhihuidemo.newscenter.tab
* @类名:         MenuControllerZhuanTi
* @创建者:     黄夏莲
* @创建时间: 2016年10月18日 ,下午10:16:38
*
* @描述:          新闻中心中,专题菜单对应的控制器
*/
public class MenuControllerZhuanTi extends MenuController
{
private TextView    tv;

public MenuControllerZhuanTi(Context context)
{
super(context);
// TODO Auto-generated constructor stub
}

@Override
protected View initView(Context context)
{
tv = new TextView(context);

tv.setTextColor(Color.RED);
tv.setTextSize(24);
tv.setGravity(Gravity.CENTER);
return tv;
}

public void initData(){
tv.setText("新闻中心中,专题菜单的内容");
}

}


MenuControllerZuTu

package huaxa.it.zhihuidemo.newscenter.tab;

import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import huaxa.it.zhihuidemo.newscenter.MenuController;

/**
*
* @项目名:     ZhiHuiDemo
* @包名:         huaxa.it.zhihuidemo.newscenter.tab
* @类名:         MenuControllerZuTu
* @创建者:     黄夏莲
* @创建时间: 2016年10月18日 ,下午10:16:22
*
* @描述:          新闻中心中,组图菜单对应的控制器
*/
public class MenuControllerZuTu extends MenuController
{
private TextView    tv;

public MenuControllerZuTu(Context context)
{
super(context);
// TODO Auto-generated constructor stub
}

@Override
protected View initView(Context context)
{
tv = new TextView(context);

tv.setTextColor(Color.RED);
tv.setTextSize(24);
tv.setGravity(Gravity.CENTER);
return tv;
}

public void initData(){
tv.setText("新闻中心中,组图菜单的内容");
}

}


MenuFragment

package huaxa.it.zhihuidemo.fragment;

import java.util.List;

import huaxa.it.zhihuidemo.BaseFragment;
import huaxa.it.zhihuidemo.MainUI;
import huaxa.it.zhihuidemo.R;
import huaxa.it.zhihuidemo.bean.NewsCenterBean.NewsCenterMenuBean;
import android.R.color;
import android.content.ClipData.Item;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

/**
* @项目名: ZhiHuiDemo
* @包名: huaxa.it.zhihuidemo.fragment
* @类名: MenuFragment
* @创建者: 黄夏莲
* @创建时间: 2016年10月5日 ,下午11:32:13
*
* @描述: 菜单页面
*/
public class MenuFragment extends BaseFragment implements OnItemClickListener
{
private ListView                    mListView;
private List<NewsCenterMenuBean>    mMenuDatas; // 菜单对应的数据
private int mCurrentMenu;
private ListAdapter adapter;

@Override
protected View initView()
{
// TextView text = new TextView(mActivity);
//
// text.setText("菜单页面");
// text.setTextSize(25);
// text.setGravity(Gravity.CENTER);
// return text;
mListView = new ListView(mActivity);
//给ListView设置样式
mListView.setBackgroundColor(Color.BLACK);
mListView.setPadding(0, 40, 0, 0);
mListView.setCacheColorHint(android.R.color.transparent);
//给ListView设置Item的onClick事件
mListView.setOnItemClickListener(this);

return mListView;
}

……
public void setData(List<NewsCenterMenuBean> datas)
{
this.mMenuDatas = datas;
//设置默认选中项
mCurrentMenu = 0;
// 设置数据Adapter --> List
adapter = new ListAdapter();
mListView.setAdapter(adapter);

}
……
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id)
{
MainUI ui = (MainUI)mActivity;
// 菜单的点击响应
//1、菜单的收起
ui.getSlidingMenu().toggle();
//2、对应实体内容的改变
ContentFragment contentFragment = ui.getContentFragment();
contentFragment.switchMenu(position);
//3、设置当前选中的菜单
mCurrentMenu = position;
adapter.notifyDataSetChanged();
}
}


ContentFragment

package huaxa.it.zhihuidemo.fragment;

import java.util.ArrayList;
import java.util.List;

import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;

import huaxa.it.zhihuidemo.BaseFragment;
import huaxa.it.zhihuidemo.MainUI;
import huaxa.it.zhihuidemo.R;
import huaxa.it.zhihuidemo.base.TabController;
import huaxa.it.zhihuidemo.base.tab.SettingTabController;
import huaxa.it.zhihuidemo.base.tab.HomeTabController;
import huaxa.it.zhihuidemo.base.tab.NewsCenterTabController;
import huaxa.it.zhihuidemo.base.tab.GovAffairTabController;
import huaxa.it.zhihuidemo.base.tab.SmartServiceTabController;
import android.R.menu;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

/**
* @项目名: ZhiHuiDemo
* @包名: huaxa.it.zhihuidemo.fragment
* @类名: ContentFragment
* @创建者: 黄夏莲
* @创建时间: 2016年10月5日 ,下午11:31:04
*
* @描述: 内容页面
*/
public class ContentFragment extends BaseFragment implements
OnCheckedChangeListener
{
// xUtils的view注解要求必须提供id,以使代码不受影响。
@ViewInject(R.id.content_pager)
private ViewPager           mViewPager;
@ViewInject(R.id.content_radiogroup)
private RadioGroup          mRadioGroup;

private List<TabController> mPagerDatas;
private int                 currentItem;

……

public void switchMenu(int position)
{
//获取当前点击的tabController页面
TabController tabController = mPagerDatas.get(currentItem);
//加载视图
tabController.switchMenu(position);
}
}


TabController

package huaxa.it.zhihuidemo.base;

import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;

import huaxa.it.zhihuidemo.MainUI;
import huaxa.it.zhihuidemo.R;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.TextView;

/**
* @项目名: ZhiHuiDemo
* @包名: huaxa.it.zhihuidemo.base
* @类名: TabController
* @创建者: 黄夏莲
* @创建时间: 2016年10月7日 ,下午3:55:14
*
* @描述: Tab页面对应的控制器
*/
public abstract class TabController implements OnClickListener
{
protected View          mRootView;
protected Context       mContext;

protected ImageButton   mIbMenu;
protected TextView      mTvTitle;
protected FrameLayout   mContentContainer;

……
/**
* 用来切换菜单的方法,如果子类有菜单,复写此类
* @param position
*/
public void switchMenu(int position){

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: