Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android實現二級下拉菜單及快速搜索功能示例

Android實現二級下拉菜單及快速搜索功能示例

編輯:Android開發實例

 一、我們要做什麼?

 上面有個搜索框,下面是一個二級下拉菜單。

 輸入查詢內容,下面列表將顯示查詢結果。

 

二、界面設計

(1)這是主框架(部分屬性已經省去,請看源碼),從上至下分別是文本框,列表,二級列表。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout> 
  3.     <LinearLayout 
  4.         android:id="@+id/city_middle"> 
  5.  
  6.         <EditText 
  7.             android:id="@+id/txtfind" 
  8.             android:hint="請輸入" > 
  9.         </EditText> 
  10.  
  11.         <ListView 
  12.             android:id="@+id/listfind" > 
  13.         </ListView> 
  14.  
  15.         <ExpandableListView 
  16.             android:id="@+id/exList" /> 
  17.     </LinearLayout> 
  18.  
  19. </LinearLayout> 

(2)一級菜單欄樣式,圖片將區別是否展開

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout  > 
  3.  
  4.     <TextView 
  5.         android:id="@+id/group" > 
  6.     </TextView> 
  7.  
  8.     <ImageView 
  9.         android:id="@+id/tubiao"> 
  10.     </ImageView> 
  11.  
  12. </LinearLayout> 

(3)二級菜單欄樣式

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout > 
  3.  
  4.     <TextView 
  5.         android:id="@+id/child"> 
  6.     </TextView> 
  7.  
  8. </LinearLayout> 

三、代碼設計

(1) 定義菜單對應數據

  1. public static List<BasicNameValuePair> fatherList = new ArrayList<BasicNameValuePair>(); 
  2. public static List<List<BasicNameValuePair>> childList = new ArrayList<List<BasicNameValuePair>>(); 

生成測試數據

  1. for (int i = 0; i < 20; i++) { 
  2.             fatherList.add(new BasicNameValuePair("father" + i, "father" + i)); 
  3.             List<BasicNameValuePair> cList = new ArrayList<BasicNameValuePair>(); 
  4.             for (int j = 0; j < 5; j++) { 
  5.                 cList.add(new BasicNameValuePair("child" + i + ":" + j, "child" 
  6.                         + i + ":" + j)); 
  7.             } 
  8.             childList.add(cList); 
  9.         } 

(2)定義列表適配器

  1. protected class ListAdapter extends BaseAdapter { 
  2.         private LayoutInflater mInflater; 
  3.         //查詢結果列表 
  4.         private List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>(); 
  5.  
  6.         public ListAdapter(Context context, String strin) { 
  7.             mInflater = LayoutInflater.from(context); 
  8.             //查詢匹配 
  9.             for (int i = 0; i < childList.size(); i++) { 
  10.                 for (int j = 0; j < childList.get(i).size(); j++) { 
  11.                     String tmp = childList.get(i).get(j).getValue(); 
  12.                     if (tmp.indexOf(strin) >= 0) { 
  13.                         list.add(new BasicNameValuePair(childList.get(i).get(j) 
  14.                                 .getName(), tmp)); 
  15.                     } 
  16.                 } 
  17.             } 
  18.         } 
  19.  
  20.         public int getCount() { 
  21.             return list.size(); 
  22.         } 
  23.  
  24.         public Object getItem(int position) { 
  25.             return position; 
  26.         } 
  27.  
  28.         public long getItemId(int position) { 
  29.             return position; 
  30.         } 
  31.  
  32.         public View getView(final int position, View convertView, 
  33.                 ViewGroup parent) { 
  34.             convertView = mInflater.inflate(R.layout.child, null); 
  35.             TextView title = (TextView) convertView.findViewById(R.id.child); 
  36.             title.setText(list.get(position).getValue()); 
  37.             return convertView; 
  38.         } 
  39.     } 

初始化列表,默認為隱藏

  1. list = (ListView) findViewById(R.id.listfind); 
  2. list.setVisibility(View.GONE); 

(3)定義二級列表適配器

  1. protected class ExAdapter extends BaseExpandableListAdapter { 
  2.  
  3.         @Override 
  4.         public int getGroupCount() { 
  5.             return fatherList.size(); 
  6.         } 
  7.  
  8.         @Override 
  9.         public int getChildrenCount(int groupPosition) { 
  10.             return childList.get(groupPosition).size(); 
  11.         } 
  12.  
  13.         @Override 
  14.         public Object getGroup(int groupPosition) { 
  15.             return fatherList.get(groupPosition).getValue(); 
  16.         } 
  17.  
  18.         @Override 
  19.         public Object getChild(int groupPosition, int childPosition) { 
  20.             return childList.get(groupPosition).get(childPosition).getValue(); 
  21.         } 
  22.  
  23.         @Override 
  24.         public long getGroupId(int groupPosition) { 
  25.             return groupPosition; 
  26.         } 
  27.  
  28.         @Override 
  29.         public long getChildId(int groupPosition, int childPosition) { 
  30.             return childPosition; 
  31.         } 
  32.  
  33.         @Override 
  34.         public View getGroupView(int groupPosition, boolean isExpanded, 
  35.                 View convertView, ViewGroup parent) { 
  36.             View view = convertView; 
  37.             if (view == null) { 
  38.                 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
  39.                 view = inflater.inflate(R.layout.group, null); 
  40.             } 
  41.             TextView t = (TextView) view.findViewById(R.id.group); 
  42.             t.setText(fatherList.get(groupPosition).getValue()); 
  43.             //展開,改變圖片 
  44.             ImageView gImg = (ImageView) view.findViewById(R.id.tubiao); 
  45.             if (isExpanded) 
  46.                 gImg.setBackgroundResource(R.drawable.mm_submenu_down_normal); 
  47.             else 
  48.                 gImg.setBackgroundResource(R.drawable.mm_submenu_normal); 
  49.             return view; 
  50.         } 
  51.  
  52.         @Override 
  53.         public View getChildView(int groupPosition, int childPosition, 
  54.                 boolean isLastChild, View convertView, ViewGroup parent) { 
  55.             View view = convertView; 
  56.             if (view == null) { 
  57.                 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
  58.                 view = inflater.inflate(R.layout.child, null); 
  59.             } 
  60.             TextView t = (TextView) view.findViewById(R.id.child); 
  61.             t.setText(childList.get(groupPosition).get(childPosition) 
  62.                     .getValue()); 
  63.             return view; 
  64.         } 
  65.  
  66.         @Override 
  67.         public boolean hasStableIds() { 
  68.             return true; 
  69.         } 
  70.  
  71.         @Override 
  72.         public boolean isChildSelectable(int groupPosition, int childPosition) { 
  73.             return true; 
  74.         } 
  75.     } 

初始化二級菜單

  1. exList = (ExpandableListView) findViewById(R.id.exList); 
  2. exList.setAdapter(new ExAdapter()); 
  3. exList.setGroupIndicator(null); 
  4. exList.setDivider(null); 

(4)搜索事件,輸入改變即觸發

  1. txtFind = (EditText) findViewById(R.id.txtfind); 
  2.         txtFind.addTextChangedListener(new TextWatcher() { 
  3.  
  4.             @Override 
  5.             public void beforeTextChanged(CharSequence s, int start, int count, 
  6.                     int after) { 
  7.             } 
  8.  
  9.             @Override 
  10.             public void onTextChanged(CharSequence s, int start, int before, 
  11.                     int count) { 
  12.             } 
  13.  
  14.             @Override 
  15.             public void afterTextChanged(Editable s) { 
  16.                 if (s != null && !s.toString().equals("")) { 
  17.                     list.setAdapter(new ListAdapter(DWinterDemoActivity.this, s 
  18.                             .toString())); 
  19.                     list.setVisibility(View.VISIBLE); 
  20.                     exList.setVisibility(View.GONE); 
  21.                 } else { 
  22.                     list.setVisibility(View.GONE); 
  23.                     exList.setVisibility(View.VISIBLE); 
  24.                 } 
  25.             } 
  26.         }); 

(5)去除焦點自動彈出輸入

  1. getWindow().setSoftInputMode( 
  2.         WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 


源碼地址:http://115.com/file/c2r9e8ib#DWinterDemo.zip
 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved