ExpandableListView與ListView不同的是具有可擴(kuò)展性,即具有下拉功能。但究其使用原理及思路,參考ListView的使用還是事半功倍的。其具有一些屬性:
1.自身帶有下拉箭頭,可通過GroupIndicator屬性值對其設(shè)置是否可視店量。當(dāng)為null時(shí),即取消自帶箭頭鞠呈。
2.ExpandableListView本身就是一個(gè)group下包含有多個(gè)item融师。因此在設(shè)置Group數(shù)據(jù)時(shí),僅僅設(shè)置單層的List<Object>集合即可蚁吝;而下屬item要設(shè)置成為雙層的List<List<Object>>集合旱爆;對于item集合舀射,內(nèi)層為item的數(shù)據(jù),外層為相應(yīng)添加的目標(biāo)group怀伦。
3.為item設(shè)置不同點(diǎn)擊的監(jiān)聽脆烟。首先在自定義Adapter類中設(shè)置重寫的isChildSelectable返回值為true;其次在ExpandableListView所處的類中設(shè)置onChildClickListener方法房待,重寫該方法的onChildClick事件邢羔。
以下是比較簡單的ExpandableListView例子:
MainActivity.java:
public class MainActivity extends AppCompatActivity {
public ExpandableListView expandableListView;
public List<String> groupListData;
public List<List<String>> itemListData=new ArrayList<List<String>>();
public ExpandAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
expandableListView = (ExpandableListView) findViewById(R.id.expand_list);
initDate();
adapter = new ExpandAdapter(this, groupListData, itemListData);
expandableListView.setAdapter(adapter);
expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Toast.makeText(MainActivity.this,"click item="+adapter.getChild(groupPosition,childPosition),Toast.LENGTH_LONG).show();
return true;
}
});
}
public void initDate(){
groupListData=new ArrayList<String>();
groupListData.add("test group 1");
groupListData.add("test group 2");
groupListData.add("test group 3");
List<String> item=new ArrayList<String>();
item.add("test item (1)");
item.add("test item (1.1)");
item.add("test item (1.1.1)");
List<String> item2=new ArrayList<String>();
item2.add("test item (2)");
item2.add("test item (2.2)");
item2.add("test item (2.2.2)");
List<String> item3=new ArrayList<String>();
item3.add("test item (3)");
item3.add("test item (3.3)");
item3.add("test item (3.3.3)");
// for(int i=0;i<groupListData.size();i++){
// itemListData.add(item);
// }
itemListData.add(item);
itemListData.add(item2);
itemListData.add(item3);
}
ExpandAdapter.java類:
public class ExpandAdapter extends BaseExpandableListAdapter{
public Context context;
public GroupViewHolder gvh;
public ItemViewHolder ivh;
public List<String> groupListData;
public List<List<String>> itemListData;
public ExpandAdapter(Context context, List<String> groupListData,List<List<String>> itemListData){
this.context=context;
this.groupListData=groupListData;
this.itemListData=itemListData;//item一定為兩層list,外層存放groupId,內(nèi)層存放itemId
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.group_layout, null);
gvh=new GroupViewHolder();
gvh.groupText=(TextView) convertView.findViewById(R.id.group_text);
convertView.setTag(gvh);
} else{
gvh=(GroupViewHolder)convertView.getTag();
}
gvh.groupText.setText(groupListData.get(groupPosition));
return convertView;
}
public class GroupViewHolder{
TextView groupText;
}
@Override
public int getGroupCount() {
return groupListData.size();
}
@Override
public Object getGroup(int groupPosition) {
return groupListData.get(groupPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_layout, null);
ivh=new ItemViewHolder();
ivh.itemText=(TextView) convertView.findViewById(R.id.item_text);
convertView.setTag(ivh);
} else {
ivh=(ItemViewHolder) convertView.getTag();
}
ivh.itemText.setText(itemListData.get(groupPosition).get(childPosition));
return convertView;
}
public class ItemViewHolder{
TextView itemText;
}
@Override
public int getChildrenCount(int groupPosition) {
return itemListData.get(groupPosition).size();//先根據(jù)groupPosition獲取某個(gè)group項(xiàng)桑孩,再獲取該group的size
}
@Override
public Object getChild(int groupPosition, int childPosition) {//獲取某個(gè)group項(xiàng)的item
return itemListData.get(groupPosition).get(childPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
@Override
public boolean hasStableIds() {
return false;
}
}
group_layout.xml與item_layout.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">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/group_text"/>
</LinearLayout>
expandableListView.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.expandable.example.sm.expandablelistview.MainActivity">
<ExpandableListView
android:id="@+id/expand_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>