上一篇文章說了使用SlidingMenu開源項目實現側滑欄,今天主要是講解多級列表ExpandableListView的使用,以及如何使用它實現電台分類管理。ExpandableListView是Android自帶的一個實現多級列表的控件,可以理解為ListView的二維實現。下面將針對如何在項目里面使用ExpandableListView進行講解。
(PS:新建的QQ群,有興趣可以加入一起討論:Android群:322599434)
ExpandableListView效果圖:
1、引用ExpandableListView控件
//Edited by mythou
//http://www.cnblogs.com/mythou/
<ExpandableListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginTop="0dp" android:background="@drawable/radio_play_bg2" //配置外層列表的背景熟悉 android:divider="@drawable/list_driver" //外層列表分割線 android:cacheColorHint="#00000000" //這個用過listView的應該都知道,避免拖動黑屏 android:listSelector="@drawable/listview_bg" //外層List列表項效果 android:childDivider="@drawable/list_driver" //子列表分割線效果
>
</ExpandableListView>
上面是我們平常在XML里面配置的屬性,這個跟我們一般使用ListView很類似,只是它多了一個子列表項的配置,后面我們會使用代碼配置其他一些屬性。ExpandableListView用法跟我們普通ListView類似,只是分開了父類ListView和子類ListView。ExpandableListView還有其他的一些屬性,有需要可以查看android官網文檔。
2、繼承BaseExpandableListAdapter
//Edited by mythou
//http://www.cnblogs.com/mythou/
public class ChannelListAdapter extends BaseExpandableListAdapter { //設置context
Context mContext; //.............
}
繼承BaseExpandableListAdapter,編寫提供數據的適配器
3、數據適配器
我們使用ListView的時候也知道,ListView需要提供一個數據適配器提供數據,ExpandableListView也同樣需要一個適配器,我們需要重載BaseExpandableListAdapter基類,編寫我們的適配器。其中最主要的是getGroupView()和getChildView()方法,這兩個方法分別返回父類列表和子類列表的列表項視圖。
//Edited by mythou
//http://www.cnblogs.com/mythou/
@Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { //生成一個LinearLayout的布局,這里是外層列表的一個列表項視圖
LinearLayout ll = new LinearLayout(mContext);
//設置LinearLayout方向 ll.setOrientation(0);
//設置列表前面的Logo ImageView logo = new ImageView(mContext);
//這里提供一個圖片文件作為Logo logo.setImageResource(logos[groupPosition]);
//設置邊距 logo.setPadding(80, 0, 0, 0);
//ImageView添加到LinearLayout里面 ll.addView(logo);
//列表項標題 TextView textView = getTextView(); textView.setTextColor(Color.WHITE);
//獲取標題資源 textView.setText(getGroup(groupPosition).toString()); ll.addView(textView); return ll; }
上面返回的View就是我們外層列表的一個列表項,主要包含一個ImageView和TextView控件,使用LinearLayout布局。當然,你也可以使用一個XML文件來布局然后通過Inflate生成一個View返回。兩種方法都可以,還有一點需要補充的是,提供的圖標資源和Text的文字,這里你可以固定在程序,也可以使用數組提供。我后面因為是關聯了電台的數據,所以使用了XML來保存電台數據,然后通過解析XML返回一個ArraryList來提供數據,這個后面我講電台數據的時候,會仔細講解。
//Edited by mythou
//http://www.cnblogs.com/mythou/
@Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { //創建布局使用的LinearLayout
LinearLayout ll = new LinearLayout(mContext);
//設置布局方向 ll.setOrientation(0);
//Logo圖片 ImageView generallogo = new ImageView(mContext); generallogo .setImageResource(generallogos[groupPosition][childPosition]); ll.addView(generallogo);
//標題資源 TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition) .toString()); ll.addView(textView);
//返回LinearLayout作為子視圖 return ll; }
上面是二級列表的列表項的視圖構造,跟外層列表的構造幾乎一樣,這里同樣構造了一個LinearLayout的布局視圖。你也可以編寫一個XML的布局,然后加載獲取一個View視圖返回。同樣,這里提供數據的方法,我后面也是改用了XML獲取數據,這里先不多說。
除了上面兩個獲取視圖的方法,剩下幾個獲取選項的列表數目的方法同樣也需要重寫,為列表提供數據。
//Edited by mythou
//http://www.cnblogs.com/mythou/
@Override public Object getGroup(int groupPosition) { //返回外層列表的對象
return generalsTypes[groupPosition]; } @Override public long getGroupId(int groupPosition) { //外層列表當前位置
return groupPosition; } @Override public int getChildrenCount(int groupPosition) { //子列表選項數目
return generals[groupPosition].length; } @Override public Object getChild(int groupPosition, int childPosition) { //獲取子視圖對象
return generals[groupPosition][childPosition]; } @Override public long getChildId(int groupPosition, int childPosition) { //子列表當前的位置
return childPosition; }
這些方法都需要重寫,提供我們列表正確的數據,這個跟一般的ListView的Adapter基本類似,只是多了一個父類列表。我們可以根據實際情況重寫其他方法。不過上面提到的方法,基本都要重寫。才能提供正常的數據給列表使用。
4、總結
今天主要是講解一下電台列表的分類,這里主要是借助二級列表實現,第一層列表主要是代表電台分類,第二層列表就是具體每一個分類里面的電台數據。這樣分級管理,邏輯上比較清新,而且用戶也比較方便查找自己喜歡的電台。下一篇文章會講解如何通過XML讀取數據然后跟我們的電台列表綁定在一起。
系列文章:
Android 開發自己的網絡收音機1——功能要求及設計方案
Android 開發自己的網絡收音機2——電台列表(SlidingMenu側滑欄)
Edited by mythou
原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3207626.html