[安卓]新聞客戶端(三) 主頁面之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));
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章