ExpandableListView
来源:互联网 发布:海岛奇兵能量神像数据 编辑:程序博客网 时间:2024/06/06 15:49
ExpandableListView顾名思义,为可展开的ListView(相当于ListView的每一行都是一个可以点击并展开的ListView)
相关知识:
ExpandableListView控件;
ExpandableListView的适配器:BaseExpandableListAdapter(用于继承)
ExpandableListView未展开时的监听回调:ExpandableListView.OnGroupCollapseListener,
ExpandableListView展开时的监听回调ExpandableListView.OnGroupExpandListener
Layout
创建一个ExpandableListView的Layout
activity_main
<?xml version="1.0" encoding="utf-8"?><ExpandableListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/expand_list" android:layout_width="wrap_content" android:layout_height="wrap_content"></ExpandableListView>
再创建两个Layout,一个是一级目录的Item布局,另一个则是二级目录的Item布局
item
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/GroupItem" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="TextView" android:gravity="center_horizontal"/></LinearLayout>
child_item
<?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:id="@+id/ChildItem" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="TextView" /></LinearLayout>
类文件
MainActivity
public class MainActivity extends AppCompatActivity { private ExpandableListView expandListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<String> list = new ArrayList<>(); ExpandAdapter adapter = new ExpandAdapter(list, this); expandListView = (ExpandableListView)findViewById(R.id.expand_list); expandListView.setAdapter(adapter); }}
Item类
public class Item { public ArrayList<String> number; public String course; public Item(String course,ArrayList number){ this.course = course; this.number = number; }}
ExpandAdapter类:ExpandableListView的适配器类,大部分需要重写的方法和BaseAdapter一样,只不过多了Group及Child的区别,便不再赘叙。
public class ExpandAdapter extends BaseExpandableListAdapter implements ExpandableListView.OnGroupCollapseListener, ExpandableListView.OnGroupExpandListener { Context context; ArrayList<Item> list; Boolean[] isOpen; /*创建一个和一级目录一样数量元素的数组,用于保存及判断一级目录是否被打开, *这个数组在该例子中并没有作用,仅仅是为了让继承的两个接口所重写的方法更具体一些 *即onGroupCollapse(int groupPosition)、onGroupExpand(int groupPosition) */ public ExpandAdapter(ArrayList list,Context context){ this.list= list; this.context = context; initListContext(); } /*为方便起见,直接添加一些简单的数据源*/ public void initListContext() { ArrayList<String> number = new ArrayList<>(); for (int i=0;i<5;i++){ number.add("课程"+i); } list.add(new Item("Java",number)); list.add(new Item("C++",number)); list.add(new Item("Python",number)); list.add(new Item("Math",number)); list.add(new Item("English",number)); } @Override public int getGroupCount() { return list.size(); } @Override public int getChildrenCount(int groupPosition) { return list.get(groupPosition).number.size(); } @Override public Object getGroup(int groupPosition) { return list.get(groupPosition); } //返回二级标签的内容 @Override public Object getChild(int groupPosition, int childPosition) { return list.get(groupPosition).number.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 true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView group_text; if (convertView == null) { convertView = LinearLayout.inflate( context, R.layout.item, null); } group_text = (TextView) convertView.findViewById(R.id.GroupItem); group_text.setText(list.get(groupPosition) .course); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView == null){ viewHolder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.child_item,null); viewHolder.itemOfText = (TextView) convertView.findViewById(R.id.ChildItem); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.itemOfText.setText(list.get(groupPosition).number.get(childPosition)); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } //ExpandableListView.OnGroupCollapseListener接口重写的方法 //当二级标签未展开时回调 @Override public void onGroupCollapse(int groupPosition) { isOpen[groupPosition] = false; } //ExpandableListView.OnGroupExpandListener接口重写的方法 //当二级标签展开时回调 @Override public void onGroupExpand(int groupPosition) { isOpen[groupPosition] = true; }}class ViewHolder{ public TextView itemOfText;}
阅读全文