大神王豐蛋哥 以前一篇博客仿餓了點餐界面2個ListView聯動(http://www.cnblogs.com/wangfengdange/p/5886064.html)html
主要實現了2個ListView怎樣實現互相關聯,正好上篇博客review了ListView控件常規使用,所以本篇博客主要對大神的那篇博客的實現進行代碼層的剖析。android
一方面,方便本身,在之後的代碼實現上加以參考。另外一方面,供剛入門的Android菜鳥們共同窗習。ide
如上圖效果圖爲仿餓了麼點餐界面的ListView級聯函數
爲了好作區分,在本文中左側的ListView稱之爲MenuListView,右側的ListView稱之爲ItemListView。佈局
1.兩個ListView在整個Activity中的Layout佈局問題post
2.手動點擊MenuListView的item,ItemListView怎麼觸發與之關聯顯示學習
如當點擊MenuListView中的「新品套餐」,右側ItemListView的getView如何顯示新品套餐的內容。this
3.手動滑動ItemListView時,MenuListView怎麼關聯到當前點擊項url
如當手動滑動ItemListView爲「飲料類」時,左側的MenuListView的當前點擊Item顯示爲飲料類,即背景色爲白色。spa
1.ListView的佈局問題
看到這個截圖的時候,第一想到的是用權重的顯示,即Android:layout_weight
第一次嘗試
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:orientation="horizontal" 7 > 8 9 <ListView 10 android:id="@+id/lv_menu" 11 android:layout_weight="1" 12 android:layout_height="match_parent" 13 android:layout_width="wrap_content" /> 14 <ListView 15 android:id="@+id/lv_item" 16 android:layout_height="match_parent" 17 android:layout_weight="2" 18 android:layout_width="wrap_content" /> 19 </LinearLayout>
則效果圖以下:
第二次嘗試,將android:layout_width="wrap_content"替換爲android:layout_width="0dp"
則能夠按須要顯示。
2.手動點擊MenuListView的item,ItemListView怎麼觸發與之關聯顯示
MenuListView和ItemListView的關聯顯示主要是經過listView自帶的函數setSelection()來關聯的
好比說,當MenuListView顯示第i項時候,則ItemListView根據i值關聯到i項的第一個值,而後設置他爲當前的setSelection.
代碼中的實現以下:
1 對MenuListView的item進行監聽 2 mListMenu.setOnItemClickListener(new ListView.OnItemClickListener(){ 3 @Override 4 public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 5 //設置當前點擊項爲i項 6 mMenuAdapter.setSelectItem(i); 7 mMenuAdapter.notifyDataSetInvalidated();// 8 //設置ItemListView的點擊項爲i項的第一個item 9 mListItem.setSelection(mTitleList.get(i)); 10 } 11 });
而i項的第一個item的獲取則是經過以下代碼來實現的
1 mTitleList = new ArrayList<Integer>(); 2 //遍歷全部item.size(),而後將第一個title不一樣的項對應的值保存起來,則關聯到每個item對應到size中的值 3 for (int i=0;i<mfoodDatas.size();i++){ 4 if (i==0){ 5 mTitleList.add(i); 6 }else if(!TextUtils.equals(mfoodDatas.get(i).getTitle(),mfoodDatas.get(i-1).getTitle())){ 7 mTitleList.add(i); 8 } 9 }
3.手動滑動ItemListView時,MenuListView怎麼關聯到當前點擊項
1 mListItem.setOnScrollListener(new AbsListView.OnScrollListener() { 2 3 private int scrollState; 4 5 @Override 6 public void onScrollStateChanged(AbsListView absListView, int i) { 7 this.scrollState = i; 8 } 9 10 @Override 11 public void onScroll(AbsListView absListView, 12 int firstVisibleItem, 13 int visibleItemCount, 14 int totalItemCount) { 15 if(scrollState== AbsListView.OnScrollListener.SCROLL_STATE_IDLE){ 16 return; 17 } 18 //判斷當前的item是不是view中第一個可見的item 19 int current = mTitleList.indexOf(firstVisibleItem); 20 if(current!=currentItem && current>0){ 21 currentItem=current; 22 //若不是的話,將menuListView的item設置currentItem,來與itemListView關聯 23 mMenuAdapter.setSelectItem(currentItem); 24 mMenuAdapter.notifyDataSetInvalidated(); 25 } 26 27 28 } 29 });
源代碼的實現仍是訪問大神王豐蛋哥 的博客仿餓了點餐界面2個ListView聯動(http://www.cnblogs.com/wangfengdange/p/5886064.html),本文只是對ListView級聯的實現做一個解析。
其中文中若分析有錯誤的地方敬請指出,有不懂的地方歡迎留言,我們一塊兒學習進步,早上進入大神的隊伍。