[安卓]新闻客户端(三) 主页面之slidingMenu & fragment(1)

这里的新闻客户端用到侧滑效果,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>



然后上面部分的是viewpager,这一大块应该有5个页面,每个页面都有相同之处,所以也建一个包,抽出一个基准类,显示整个viewpager的布局

之前的引导页是建立一个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));
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值