Android 使用BaseAdapter创建实用ListView
本程序的目的是写一个通用的、实用的菜单项ListView,掌握BaseAdapter 、ListView、style 的使用
先看看我们最终实现的效果

废话少说直接上代码:
主Activity类,MenuTuiCoolActivity.java 文件
1 public class MenuTuicoolActivity extends Activity { 2 3 //定义菜单分隔条类 4 private static class Category { 5 String mTitle; 6 Category(String title) { 7 mTitle = title; 8 } 9 } 10 11 //定义菜单项类 12 private static class MenuItem{ 13 14 private String menuText ; 15 private int menuIcon ; 16 17 public MenuItem(String menuText , int menuIcon){ 18 this.menuText=menuText ; 19 this.menuIcon=menuIcon ; 20 } 21 22 public String getMenuText(){ 23 return this.menuText ; 24 } 25 26 public int getMenuIcon(){ 27 return this.menuIcon ; 28 } 29 } 30 31 //定义自定义菜单项组Adapter 32 private class MenuAdapter extends BaseAdapter{ 33 34 //用来存贮菜单项和菜单分隔条对象 35 private List<Object> menuItems = new ArrayList<Object>() ; 36 37 //加载所有的菜单项和菜单分隔条 38 public MenuAdapter(){ 39 40 menuItems.add(new Category("分组一")) ; 41 menuItems.add(new MenuItem("离线",R.drawable.img_1)) ; 42 menuItems.add(new MenuItem("站点",R.drawable.img_2)); 43 44 menuItems.add(new Category("分组二")); 45 menuItems.add(new MenuItem("搜索",R.drawable.img_3)) ; 46 menuItems.add(new MenuItem("发现",R.drawable.img_4)) ; 47 menuItems.add(new MenuItem("设置",R.drawable.img_5)) ; 48 } 49 50 @Override 51 public int getCount() { 52 return menuItems.size(); 53 } 54 55 @Override 56 public Object getItem(int position) { 57 return menuItems.get(position); 58 } 59 60 @Override 61 public long getItemId(int position) { 62 return position; 63 } 64 65 /*这个方法和下面的一个方法只是用于标定你所创建的菜单中有几种类型的项目, 66 *一般来说就有两种,一种是分隔条项目、一种是实际的可选项目,这两个方法不会自动回调 67 *只是为让程序员在getView()等方法中能够方便使用这两个方法来判定当前的项目的类型 68 **/ 69 public int getItemViewType(int position) { 70 return getItem(position) instanceof MenuItem ? 0 : 1; 71 } 72 73 @Override 74 public int getViewTypeCount() { 75 return 2; 76 } 77 78 //当前的对象对应的组件是否能够被选中或者被点击,即菜单项对象能够被点击,分隔条对象不能够被点击 79 @Override 80 public boolean isEnabled(int position) { 81 return getItem(position) instanceof MenuItem; 82 } 83 84 //指明Adapter中的所有的对象对应的组件是否都能够被点击 85 @Override 86 public boolean areAllItemsEnabled() { 87 return false; 88 } 89
//需要注意的一点是:每次程序在重绘这个ListView的时候,都会重新的调用一次这个方法 90 @Override 91 public View getView(int position, View convertView, ViewGroup parent) { 92
//注意这个convertView保存的是旧View,因为每次都要重绘,那么我们可以通过监测convertView是否是null,如果不是null呢么我们就可以直接使用这个convertView
//直接返回,但是下面我们没有这么做,在MenuDrawer中我们会使用convertView重用旧视图,可以看看 93 View view = convertView ; 94 95 //根据position处的对象的类型,来判定当前的对象应该对应菜单项还是分隔条,从而加载不同的View 96 if(getItemViewType(position) == 0){ 97 view =getLayoutInflater().inflate(R.layout.menu_tuicool, parent, false); 98 ((TextView) view).setText(((MenuItem)menuItems.get(position)).getMenuText()) ; 99 ((TextView) view).setCompoundDrawablesWithIntrinsicBounds( 100 ((MenuItem)menuItems.get(position)).getMenuIcon(), 0, 0, 0); 101 }else{ 102 view = getLayoutInflater().inflate(R.layout.category_style, parent, false); 103 ((TextView) view).setText(((Category)menuItems.get(position)).mTitle); 104 } 105 return view; 106 } 107 } 108 109 //定义菜单适配器 110 private MenuAdapter menuAdapter ; 111 112 @Override 113 protected void onCreate(Bundle savedInstanceState) { 114 super.onCreate(savedInstanceState); 115 116 ListView menuList= new ListView(this) ; 117 menuAdapter = new MenuTuicoolActivity.MenuAdapter() ; 118 menuList.setAdapter(menuAdapter); 119 setContentView(menuList); 120 } 121 }
菜单分隔条布局文件,category_style.xml文件:
1 <?xml version="1.0" encoding="utf-8"?> 2 <TextView xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 style="@style/category_style"> 6 </TextView>
菜单项布局文件,menu_tuicool.xml文件:
1 <TextView 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="wrap_content" 5 style="@style/item_style"/>
styles.xml文件:
1 <resources> 2 3 <!-- 4 Base application theme, dependent on API level. This theme is replaced 5 by AppBaseTheme from res/values-vXX/styles.xml on newer devices. 6 --> 7 <style name="AppBaseTheme" parent="android:Theme.Light"> 8 <!-- 9 Theme customizations available in newer API levels can go in 10 res/values-vXX/styles.xml, while customizations related to 11 backward-compatibility can go here. 12 --> 13 </style> 14 15 <!-- Application theme. --> 16 <style name="AppTheme" parent="AppBaseTheme"> 17 <!-- All customizations that are NOT specific to a particular API-level can go here. --> 18 </style> 19 20 <style name="item_style"> 21 <item name="android:background">@drawable/md__list_selector_disabled_holo_dark</item> 22 <item name="android:textAppearance">?android:attr/textAppearance</item> 23 <item name="android:textColor">?android:attr/textColorPrimaryInverse</item> 24 <item name="android:textSize">18sp</item> 25 <item name="android:paddingLeft">16dp</item> 26 <item name="android:paddingRight">32dp</item> 27 <item name="android:paddingTop">8dp</item> 28 <item name="android:paddingBottom">8dp</item> 29 <item name="android:drawablePadding">16dp</item> //图片和文字之间的距离 30 <item name="android:gravity">center_vertical</item> 31 </style> 32 <style name="category_style"> 33 <item name="android:textStyle">bold</item> 34 <item name="android:textColor">?android:attr/textColorSecondaryInverse</item> 35 <item name="android:textSize">14sp</item> 36 <item name="android:textAllCaps">true</item> 37 38 <item name="android:gravity">center_vertical</item> 39 <item name="android:paddingLeft">16dp</item> 40 <item name="android:background">@drawable/md__category_background</item> 41 //这两个属性一般在一起使用,关于ellipsize的使用参见之前的博文 42 <item name="android:singleLine">true</item> 43 <item name="android:ellipsize">end</item> 44 </style> 45 </resources>

浙公网安备 33010602011771号