這裏的新聞客戶端用到側滑效果,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));
}