吳裕雄--天生自然ANDROID開發學習:2.5.5 ExpandableListView(可摺疊列表)的基本使用
阿新 • • 發佈:2020-08-29
1.相關屬性 android:childDivider:指定各組內子類表項之間的分隔條,圖片不會完全顯示, 分離子列表項的是一條直線 android:childIndicator:顯示在子列表旁邊的Drawable物件,可以是一個影象 android:childIndicatorEnd:子列表項指示符的結束約束位置 android:childIndicatorLeft:子列表項指示符的左邊約束位置 android:childIndicatorRight:子列表項指示符的右邊約束位置 android:childIndicatorStart:子列表項指示符的開始約束位置 android:groupIndicator:顯示在組列表旁邊的Drawable物件,可以是一個影象 android:indicatorEnd:組列表項指示器的結束約束位置 android:indicatorLeft:組列表項指示器的左邊約束位置 android:indicatorRight:組列表項指示器的右邊約束位置 android:indicatorStart:組列表項指示器的開始約束位置
2.實現ExpandableAdapter的三種方式 1. 擴充套件BaseExpandableListAdpter實現ExpandableAdapter。 2. 使用SimpleExpandableListAdpater將兩個List集合包裝成ExpandableAdapter 3. 使用simpleCursorTreeAdapter將Cursor中的資料包裝成SimpleCuroTreeAdapter 本節示例使用的是第一個,擴充套件BaseExpandableListAdpter
下面我們就來實現上圖的這個效果: 核心是重寫BaseExpandableListAdpter,其實和之前寫的普通的BaseAdapter是類似的, 但是BaseExpandableListAdpter則分成了兩部分:組和子列表 另外,有一點要注意的是,重寫isChildSelectable()方法需要返回true,不然不會觸發 子Item的點選事件!下面我們來寫寫: 首先是組和子列表的佈局: item_exlist_group.xml: <?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="horizontal" android:padding="5dp"> <TextView android:id="@+id/tv_group_name" android:layout_width="match_parent" android:layout_height="56dp" android:gravity="center_vertical" android:paddingLeft="30dp" android:text="AP" android:textStyle="bold" android:textSize="20sp" /> </LinearLayout> item_exlist_item.xml: <?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="horizontal" android:padding="5dp" android:background="#6BBA79"> <ImageView android:id="@+id/img_icon" android:layout_width="48dp" android:layout_height="48dp" android:src="@mipmap/iv_lol_icon1" android:focusable="false"/> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="15dp" android:focusable="false" android:text="提莫" android:textSize="18sp" /> </LinearLayout> 然後是自定義的Adapter類: MyBaseExpandableListAdapter.java: /** * Created by Jay on 2015/9/25 0025. */ public class MyBaseExpandableListAdapter extends BaseExpandableListAdapter { private ArrayList<Group> gData; private ArrayList<ArrayList<Item>> iData; private Context mContext; public MyBaseExpandableListAdapter(ArrayList<Group> gData,ArrayList<ArrayList<Item>> iData, Context mContext) { this.gData = gData; this.iData = iData; this.mContext = mContext; } @Override public int getGroupCount() { return gData.size(); } @Override public int getChildrenCount(int groupPosition) { return iData.get(groupPosition).size(); } @Override public Group getGroup(int groupPosition) { return gData.get(groupPosition); } @Override public Item getChild(int groupPosition, int childPosition) { return iData.get(groupPosition).get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } //取得用於顯示給定分組的檢視. 這個方法僅返回分組的檢視物件 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolderGroup groupHolder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate( R.layout.item_exlist_group, parent, false); groupHolder = new ViewHolderGroup(); groupHolder.tv_group_name = (TextView) convertView.findViewById(R.id.tv_group_name); convertView.setTag(groupHolder); }else{ groupHolder = (ViewHolderGroup) convertView.getTag(); } groupHolder.tv_group_name.setText(gData.get(groupPosition).getgName()); return convertView; } //取得顯示給定分組給定子位置的資料用的檢視 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolderItem itemHolder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate( R.layout.item_exlist_item, parent, false); itemHolder = new ViewHolderItem(); itemHolder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon); itemHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); convertView.setTag(itemHolder); }else{ itemHolder = (ViewHolderItem) convertView.getTag(); } itemHolder.img_icon.setImageResource(iData.get(groupPosition).get(childPosition).getiId()); itemHolder.tv_name.setText(iData.get(groupPosition).get(childPosition).getiName()); return convertView; } //設定子列表是否可選中 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private static class ViewHolderGroup{ private TextView tv_group_name; } private static class ViewHolderItem{ private ImageView img_icon; private TextView tv_name; } } PS:儲存子列表的資料不一定要用ArrayList<ArrayList>這種,根據自己的需求 定義~ 最後是MainActivity的佈局以及Java程式碼: 佈局檔案:activity_main.xml: <RelativeLayout 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:padding="5dp" tools:context=".MainActivity"> <ExpandableListView android:id="@+id/exlist_lol" android:layout_width="match_parent" android:layout_height="match_parent" android:childDivider="#E02D2F"/> </RelativeLayout> MainActivity.java: public class MainActivity extends AppCompatActivity { private ArrayList<Group> gData = null; private ArrayList<ArrayList<Item>> iData = null; private ArrayList<Item> lData = null; private Context mContext; private ExpandableListView exlist_lol; private MyBaseExpandableListAdapter myAdapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = MainActivity.this; exlist_lol = (ExpandableListView) findViewById(R.id.exlist_lol); //資料準備 gData = new ArrayList<Group>(); iData = new ArrayList<ArrayList<Item>>(); gData.add(new Group("AD")); gData.add(new Group("AP")); gData.add(new Group("TANK")); lData = new ArrayList<Item>(); //AD組 lData.add(new Item(R.mipmap.iv_lol_icon3,"劍聖")); lData.add(new Item(R.mipmap.iv_lol_icon4,"德萊文")); lData.add(new Item(R.mipmap.iv_lol_icon13,"男槍")); lData.add(new Item(R.mipmap.iv_lol_icon14,"韋魯斯")); iData.add(lData); //AP組 lData = new ArrayList<Item>(); lData.add(new Item(R.mipmap.iv_lol_icon1, "提莫")); lData.add(new Item(R.mipmap.iv_lol_icon7, "安妮")); lData.add(new Item(R.mipmap.iv_lol_icon8, "天使")); lData.add(new Item(R.mipmap.iv_lol_icon9, "澤拉斯")); lData.add(new Item(R.mipmap.iv_lol_icon11, "狐狸")); iData.add(lData); //TANK組 lData = new ArrayList<Item>(); lData.add(new Item(R.mipmap.iv_lol_icon2, "諾手")); lData.add(new Item(R.mipmap.iv_lol_icon5, "德邦")); lData.add(new Item(R.mipmap.iv_lol_icon6, "奧拉夫")); lData.add(new Item(R.mipmap.iv_lol_icon10, "龍女")); lData.add(new Item(R.mipmap.iv_lol_icon12, "狗熊")); iData.add(lData); myAdapter = new MyBaseExpandableListAdapter(gData,iData,mContext); exlist_lol.setAdapter(myAdapter); //為列表設定點選事件 exlist_lol.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Toast.makeText(mContext, "你點選了:" + iData.get(groupPosition).get(childPosition).getiName(), Toast.LENGTH_SHORT).show(); return true; } }); } }
官方API:ExpandableListView