这里的新闻客户端用到侧滑效果,slidingMenu,github上的开源项目
需要导入第三方库,具体过程不说了~
这个侧滑工具的用法有好几种,但是较常见的还是结合fragment来使用,使用fragment作为侧滑菜单的布局容器,直接继承一个SlidingFragmentActivity,然后再有几个fragment来装侧滑栏就好
附上一个介绍基本用法的博文
http://blog.csdn.net/lmj623565791/article/details/36677279
首先框架的搭建,需要初始化slidingmenu,然后初始化fragment
这里需要两个fragment填充activity,由于一些方法是共有的,抽到一个basefragment,需要暴露一些方法出来,其中初始化方法应该是抽象的,子类必须实现它
另外,activity_main本身就可以作为一个fragment载体,他的布局文件里应该有一个ID;另外一个载体只要有一个布局就好,无需去写activity
activity_main
public class MainActivity extends SlidingFragmentActivity{
private static final String FRAGMENT_LEFT_MENU = "fragment_left_menu";
private static final String FRAGMENT_CONTENT = "fragment_content";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//设置主页面无标题
setContentView(R.layout.activity_main); //主页面
//第一步 初始化slidingMenu
initSlidingMenu();
//第二步 初始化fragment
initFragment();
}
private void initFragment() {
//第二步(2) Fragment和activity联系需要FragmentManager 实例化
FragmentManager fm = getSupportFragmentManager();
//第二步(3) 由FragmentManager开启事务 begin方法
FragmentTransaction transaction = fm.beginTransaction();
//第二步(4) 用Fragment替换activity
transaction.replace(R.id.fl_left_menu, new LeftMenuFragment(),
FRAGMENT_LEFT_MENU);// 用fragment替换framelayout
transaction.replace(R.id.fl_content, new ContentFragment(),
FRAGMENT_CONTENT);
//第二步(5) 提交
transaction.commit();
}
// 获取侧边栏fragment
public LeftMenuFragment getLeftMenuFragment() {
FragmentManager fm = getSupportFragmentManager();
LeftMenuFragment fragment = (LeftMenuFragment) fm.findFragmentByTag(FRAGMENT_LEFT_MENU);
return fragment;
}
// 获取主页面fragment
public ContentFragment getContentFragment() {
FragmentManager fm = getSupportFragmentManager();
ContentFragment fragment = (ContentFragment) fm.findFragmentByTag(FRAGMENT_CONTENT);
return fragment;
}
private void initSlidingMenu() {
// 第一步(2) 找到侧边栏
setBehindContentView(R.layout.activity_behind);
//第一步(3) get一个SlidingMenu实例
SlidingMenu menu = getSlidingMenu();
//第一步(4) set出触摸方式和边距,都是必须
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
menu.setBehindOffset(220);
}
}
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/fl_content">
</FrameLayout>
另一个载体
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#FF0000"
android:id="@+id/fl_left_menu">
</FrameLayout>
basefragment
public abstract class BaseFragement extends Fragment{
protected Activity mActivity;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
initData();
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
mActivity = getActivity();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return initViews();
}
public abstract View initViews() ;
public void initData(){} ;
}
LeftMenuFragment
public class LeftMenuFragment extends BaseFragement{
@Override
public View initViews() {
// TODO Auto-generated method stub
return null;
}
}
ContentFragment
public class ContentFragment extends BaseFragement{
@Override
public View initViews() {
// TODO Auto-generated method stub
return null;
}
}
再来实现fragment的具体内容
首先来看contentfragment
上面应该是一个viewpager,下面是一由5个RadioButton组成的RadioGroup;
这里的radiobutton很大程度相似,可以在values定义styles属性,其中对字体设置selector
另外,每个button图标都应该有一个selector,点击时颜色变化
以上selector应该在drawable内,同时button的图标要导入高分辨率的drawable文件夹里。
注意在button上显示图片的属性是 drawableTop ;另外去掉button原有的一个标志 button @null
button
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/govaffairs_press" android:state_checked="true"/>
<item android:drawable="@drawable/govaffairs"/>
</selector>
styles
<!-- 低栏RadioButton的样式 -->
<style name="BottomTabStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center_vertical</item>
<item name="android:button">@null</item>
<item name="android:drawablePadding">3dp</item>
<item name="android:padding">5dp</item>
<item name="android:textColor">@drawable/btn_tab_text_selector</item>
<item name="android:layout_weight">1</item>
<item name="android:gravity">center</item>
</style>
字体
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#f00" android:state_checked="true"/>
<item android:color="#fff"/>
</selector>
在渲染layout的时候,则下面的button不设权重,先渲染,然后wrapcontent;给viewpager设置一个layout_weight,则后渲染,权重设为1000,并match_parent,充满剩下的全屏
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RadioGroup
android:id="@+id/rg_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bottom_tab_bg"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/rb_home"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_home_selector"
android:text="首页" />
<RadioButton
android:id="@+id/rb_news"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_news_selector"
android:text="新闻中心" />
<RadioButton
android:id="@+id/rb_smart"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_smart_selector"
android:text="智慧服务" />
<RadioButton
android:id="@+id/rb_gov"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_gov_selector"
android:text="政务" />
<RadioButton
android:id="@+id/rb_setting"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_setting_selector"
android:text="设置" />
</RadioGroup>
</LinearLayout>
之前的引导页是建立一个arraylist来直接存放imageview,而这里是一个组合型的,上面一栏是一个imagebutton和textview,下面给一个帧布局(具体内容每一个页面不同,要塞进不同数据),这里也是给帧布局一个权重,而上面的组合布局不给,则这个组合布局先渲染,高度设为wrap_content,帧布局则fill_parent,布满剩余屏幕
他的布局,注意imagebutton不能指定text,而是要设置src来指定图标
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_red_bg" >
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="智慧北京"
android:textColor="#fff"
android:textSize="22sp" />
<ImageButton
android:id="@+id/btn_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:background="@null"
android:src="@drawable/img_menu" />
</RelativeLayout>
<FrameLayout
android:id="@+id/fl_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</FrameLayout>
</LinearLayout>
contentFragment里面显示这个viewpager需要adapter填充view,而在BasePager里应该要做一些初始化这个view再传给contentFragment的动作,这一步是公用的
basepager里需要初始化view和数据,之前的contentfragment里也有,区别是后者是系统调用的,而这里是在需要的地方自己调用
注意:inflate时需要上下文,这里在构造函数里直接给了一个activity,因为activity是context的间接子类,在这里代表了当前的activity,可以获取到其中的控件什么的(很多地方都用到了类似的mactivity),我们把东西填充到mRootView里,而不是挂在这个activity下
同时在这个base的初始化方法里面,要实现imagebutton的点击问题,他是可以收缩的
还有一个额外的问题,对于有重叠的父控件、子控件获得触摸事件的问题,需要重写onTouchEvent方法,尤其是这里的新闻子页面,这就导致我们不能直接在XML里用v4 har包全名来定义viewpager,而是需要重写一个类来继承viewPager,然后在XML里写上这个类的全名
给一个链接 http://blog.csdn.net/lvxiangan/article/details/9309927
basepager
public class BasePager {
public Activity mActivity;
public View mRootView; //整个的layout view
public TextView tvTitle;// 页面上面的title
public FrameLayout flContent;// 页面中间的空白区域,可以往里面添加东西
public ImageButton btnMenu;// title旁边的 按钮(在部分子页面上需要隐藏掉)
public BasePager(Activity activity) {
mActivity = activity;
initViews();
}
/**
* 初始化布局
*/
public void initViews() {
mRootView = View.inflate(mActivity,R.layout.base_pager, null);
tvTitle = (TextView) mRootView.findViewById(R.id.tv_title);
flContent = (FrameLayout) mRootView.findViewById(R.id.fl_content);
btnMenu = (ImageButton) mRootView.findViewById(R.id.btn_menu);
btnMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
toggleSlidingMenu();
}
});
}
/**
* 初始化数据
*/
public void initData() {
}
/*
* toggle函数,当前状态是显示,则调用后会不显示,当前不显示,则调用后会显示
*/
protected void toggleSlidingMenu() {
MainActivity mainUi = (MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
slidingMenu.toggle();// 让sliding menu 显示或者 缩回
}
public void setSlidingMenuEnable(boolean enable) {
MainActivity mainUi = (MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
if (enable) {
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
} else {
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
}
viewpager的定义及重写onTouchEvent
public class NoScrollViewPager extends ViewPager{
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public NoScrollViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
// 解决 新闻详情页tab里面的viewpager 由于上层的viewpager 档掉touch事件,下层无法滑动的bug
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return false;
}
/**
* onTouchEvent 不要让这个ViewPager 滑动
*/
@Override
public boolean onTouchEvent(MotionEvent arg0) {
return false;
}
}
则完整的contentFragment的布局应该是
</pre><pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.example.mynewsapp.view.NoScrollViewPager
android:id="@+id/vp_content"
android:layout_weight="1000"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<RadioGroup
android:id="@+id/rg_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bottom_tab_bg"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/rb_home"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_home_selector"
android:text="首页" />
<RadioButton
android:id="@+id/rb_news"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_news_selector"
android:text="新闻中心" />
<RadioButton
android:id="@+id/rb_smart"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_smart_selector"
android:text="智慧服务" />
<RadioButton
android:id="@+id/rb_gov"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_gov_selector"
android:text="政务" />
<RadioButton
android:id="@+id/rb_setting"
style="@style/BottomTabStyle"
android:drawableTop="@drawable/btn_tab_setting_selector"
android:text="设置" />
</RadioGroup>
</LinearLayout>
这5个页面,除了基准类的相同处,还有不同的具体内容(放在基准类的帧布局里),需要具体的实例放进一个包里
这一部分,要单独实现,每一个类里面都要去初始化,新闻类特殊一点,要去服务器端获取,其余几个基本类似,注意,首尾两个页面是不能滑动的
ublic class GovAffairsPager extends BasePager{
public GovAffairsPager(Activity activity) {
super(activity);
// TODO Auto-generated constructor stub
}
@Override
public void initViews() {
// TODO Auto-generated method stub
super.initViews();
}
@Override
public void initData() {
// TODO Auto-generated method stub
tvTitle.setText("人口管理");
TextView text = new TextView(mActivity);
text.setText("政务");
text.setTextColor(Color.RED);
text.setTextSize(25);
text.setGravity(Gravity.CENTER);
// 向FrameLayout中动态添加布局
flContent.addView(text);
setSlidingMenuEnable(true);//侧边栏开启
System.out.println("GovAffairsPager.initData()");
}
}
这里新闻端链接服务器用到了Xutils,解析用到gson,将数据转换成json格式,还要涉及到跨fragment获取数据
另外新闻也可以设为默认
这一块后面再详述~
几个子类实现后,就需要填充了
注意,在几个子fragment内,继承了base的初始化方法,但是这里系统不会调用,必须自己去调用,否则是不会显示数据的,这就要在contentFragment内调用这个方法
不要放在instantiateItem内,由于加载机制会预加载下一个页面,这样有问题,应该放在页面变动的监听器内
contentFragment,先要初始化view,通过ID找到;然后初始化数据,adapter相关就在这里,之前的guide页面是直接在arraylist里添加imageview,这里是要加上前面定义的组合类返回的view,需要找到basepager里面的mRootView;;最后还要设置下面的button,在其监听事件里面调用子fragment的初始化方法,同时有了监听后,只能点击button切换上面的view,而不能拖动上面的viewpager了
另外viewpager滑动时有动画效果,可以设置setcurrentitem来禁用
public class ContentFragment extends BaseFragement{
private RadioGroup rgGroup ;
private ArrayList<BasePager> mPagerList;
ViewPager mViewPager;
@Override
public View initViews() {
// TODO Auto-generated method stub
View view = View.inflate(mActivity,R.layout.fragment_content, null);
rgGroup = (RadioGroup) view.findViewById(R.id.rg_group);
mViewPager = (ViewPager) view.findViewById(R.id.vp_content);
return view;
}
@Override
public void initData() {
// TODO Auto-generated method stub
super.initData();
rgGroup.check(R.id.rb_home);
// 初始化5个子页面
mPagerList = new ArrayList<BasePager>();
HomePager paper1 = new HomePager(mActivity);
NewsCenterPager paper2 = new NewsCenterPager(mActivity);
GovAffairsPager paper3 = new GovAffairsPager(mActivity);
SmartServicePager paper4 = new SmartServicePager(mActivity);
SettingPager paper5 = new SettingPager(mActivity);
mPagerList.add(paper1);
mPagerList.add(paper2);
mPagerList.add(paper3);
mPagerList.add(paper4);
mPagerList.add(paper5);
mViewPager.setAdapter(new ContentAdapter());
//处理下面一排的radiogroup选中变化的事件。切换上面的viewpager
rgGroup.setOnCheckedChangeListener( new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
switch (checkedId) {
case R.id.rb_home:
// mViewPager.setCurrentItem(0);// 设置当前页面
mViewPager.setCurrentItem(0, false);// 去掉切换页面的动画
break;
case R.id.rb_news:
mViewPager.setCurrentItem(1, false);// 设置当前页面
break;
case R.id.rb_smart:
mViewPager.setCurrentItem(2, false);// 设置当前页面
break;
case R.id.rb_gov:
mViewPager.setCurrentItem(3, false);// 设置当前页面
break;
case R.id.rb_setting:
mViewPager.setCurrentItem(4, false);// 设置当前页面
break;
default:
break;
}
}
});
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
mPagerList.get(arg0).initData(); //可以将 每个pager的初始化动作放在这里,这样就不会出现预加载
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
mPagerList.get(0).initData();// 默认进来需要初始化首页数据
}
class ContentAdapter extends PagerAdapter {
@Override
public int getCount() {
return mPagerList.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
BasePager pager = mPagerList.get(position);
container.addView(pager.mRootView);
//pager.initData();// 初始化数据.... 不要放在此处初始化数据, 否则会预加载下一个页面
return pager.mRootView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
/*BasePager pager = mPagerList.get(position);
container.removeView(pager.mRootView);*/
container.removeView((View) object);
}
}
}
OK~
再来实现新闻这个页面,需要连接服务器,然后解析数据等,这里由于连接服务器的地方比较多,把地址抽成一个全局类,注意端口号的写法,在自己机子上可以不写具体的IP地址,直接使用一个号去找服务器。另外再tomcat的myapp下应该有一个工程名,里面放一个json格式的数据文件,保存的是侧边栏信息,因为新闻页面比较特殊,新闻也分很多种,侧边栏里分类
public class GlobalContants {
//public static final String SERVER_URL = "http://192.168.1.105:8080/java";
public static final String SERVER_URL = "http://10.0.2.2:8080/java";
public static final String CATEGORIES_URL = SERVER_URL + "/categories.json";
}
另外,服务器返回的数据,需要转成json格式,这样可以动态获取数据,解放服务器端,需要一个bean来定义,newsdata
public class NewsData {
public ArrayList<NewsMenuData> data;
public int retcode;
// 侧边栏数据对象(共有四个 ,分别是新闻,专题,组图,互动)
public class NewsMenuData {
public String id;
public String title;
public int type;
public String url;
public ArrayList<NewsTabData> children;
@Override
public String toString() {
return "NewsMenuData [title=" + title + ", children=" + children
+ "]";
}
}
//新闻页面下11个子页签的数据对象 (其他侧边栏服务器返回的数据中 没这个栏位)
public class NewsTabData {
public String id;
public String title;
public int type;
public String url;
@Override
public String toString() {
return "NewsTabData [title=" + title + "]";
}
}
@Override
public String toString() {
return "NewsData [data=" + data + "]";
}
}
把解析的result给到newsdata类,这样子数据就获取到了
public class NewsCenterPager extends BasePager{
private NewsData mNewsData;
public NewsCenterPager(Activity activity) {
super(activity);
// TODO Auto-generated constructor stub
}
@Override
public void initViews() {
// TODO Auto-generated method stub
super.initViews();
}
@Override
public void initData() {
// TODO Auto-generated method stub
tvTitle.setText("新闻");
setSlidingMenuEnable(true);//侧边栏开启
System.out.println("NewsCenterPager.initData()");
//进入这个pager的时候,去服务器中国获取数据
getDataFromServer() ;
}
/**
* 从服务器获取数据
*/
private void getDataFromServer() {
HttpUtils utils = new HttpUtils();
// 使用xutils发送请求
utils.send(HttpMethod.GET, GlobalContants.CATEGORIES_URL,
new RequestCallBack<String>() {
// 访问成功, 在主线程运行
@Override
public void onSuccess(ResponseInfo responseInfo) {
String result = (String) responseInfo.result;
System.out.println("返回结果:" + result);
parseData(result);
}
// 访问失败, 在主线程运行
@Override
public void onFailure(HttpException error, String msg) {
Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
.show();
error.printStackTrace();
}
});
}
/**
* 解析网络数据
*
* @param result
*/
protected void parseData(String result) {
Gson gson = new Gson();
mNewsData = gson.fromJson(result, NewsData.class);
System.out.println("解析结果:" + mNewsData);
}
}
这个mNewsData就是bean啦,按照title去区分
然后数据在新闻的pager里获取的,却要在侧边栏里点击修改,这就涉及到fragment数据传递,一般可以用fragmentmanager来实现,但这里用了更简单的方法,成员变量,mActivity,两边都有,这样就可以通过他来获取到,在新闻里去获取侧边栏,main里面有获取两个fragment的方法
然后侧边栏里应该有一个设置数据的方法,在新闻这边调用,获取到的信息传给他,填充侧边栏的listview
protected void parseData(String result) {
Gson gson = new Gson();
mNewsData = gson.fromJson(result, NewsData.class);
System.out.println("解析结果:" + mNewsData);
// 刷新测边栏的数据
MainActivity mainUi = (MainActivity) mActivity;
LeftMenuFragment leftMenuFragment = mainUi.getLeftMenuFragment();
leftMenuFragment.setMenuData(mNewsData.data);
}
侧边栏里的方法
public void setMenuData(ArrayList<NewsMenuData> data){
this.menulistdata = data;
menulistadapter = new MyMenuListAdapter();
lv_left_menu.setAdapter(menulistadapter);
}
将这边传过来的数据放到list里,然后再让adapter来操作
而侧边栏这边,首先初始化view,然后是数据,点击需要响应,同时点击后更改新闻里的数据,这又要adapter来填充,这里的listview要给他一个布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp" >
<TextView
android:id="@+id/tv_leftmenu_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableLeft="@drawable/btn_menu_selector"
android:drawablePadding="5dp"
android:enabled="false"
android:text="新闻"
android:textColor="@drawable/text_menu_selector"
android:textSize="25sp" />
</LinearLayout>
然后selector,还有倒入图片,略过不提了~
public class LeftMenuFragment extends BaseFragement{
ListView lv_left_menu;
public ArrayList<NewsMenuData> menulistdata;
private MyMenuListAdapter menulistadapter ;
private int mCurrentPos;
@Override
public View initViews() {
// 初始化view
View view = View.inflate(mActivity, R.layout.fragment_left_menu, null);
lv_left_menu=(ListView) view.findViewById(R.id.lv_left_menu);
return view;
}
@Override
public void initData() {
// 初始化数据,点击事件,同时点击后填充数据,adapter
super.initData();
lv_left_menu.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
mCurrentPos = position;
menulistadapter.notifyDataSetChanged();
}
});
}
class MyMenuListAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return menulistdata.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v = View.inflate(mActivity, R.layout.list_menu_item, null);
TextView tv = (TextView) v.findViewById(R.id.tv_leftmenu_title);
tv.setText(menulistdata.get(position).title);
if (position==mCurrentPos) {
tv.setEnabled(true);
}
else {
tv.setEnabled(false);
}
return v;
}
}
public void setMenuData(ArrayList<NewsMenuData> data){
this.menulistdata = data;
menulistadapter = new MyMenuListAdapter();
lv_left_menu.setAdapter(menulistadapter);
}
}
这里还要继续完善,当点击侧边栏时,新闻那一块是要变动的,实际上又是有4个view,这里继续抽出一个基类和4个子类,其中比较复杂一点的是专门的新闻页面
public abstract class BaseMenuDetailPager {
public Activity mActivity;
public View mRootView;//这个类的view
public BaseMenuDetailPager(Activity activity) {
mActivity = activity;
mRootView = initViews();
}
/**
* 初始化view 需要子类实现
*/
public abstract View initViews();
/**
*初始化数据
*/
public void initData() {
}
}
public class InteractMenuDetailPager extends BaseMenuDetailPager {
public InteractMenuDetailPager(Activity activity) {
super(activity);
}
@Override
public View initViews() {
TextView text = new TextView(mActivity);
text.setText("互动页面");
text.setTextColor(Color.RED);
text.setTextSize(25);
text.setGravity(Gravity.CENTER);
return text;
}
}
然后在原来的新闻pager里设置这几个子view
protected void parseData(String result) {
Gson gson = new Gson();
mNewsData = gson.fromJson(result, NewsData.class);
System.out.println("解析结果:" + mNewsData);
// 刷新测边栏的数据
MainActivity mainUi = (MainActivity) mActivity;
LeftMenuFragment leftMenuFragment = mainUi.getLeftMenuFragment();
leftMenuFragment.setMenuData(mNewsData.data);
// 准备4个菜单详情页
mPagers = new ArrayList<BaseMenuDetailPager>();
mPagers.add(new TopicMenuDetailPager(mActivity));
mPagers.add(new PhotoMenuDetailPager(mActivity));
mPagers.add(new InteractMenuDetailPager(mActivity));
}