Android中级联列表ExpandableListView使用

来源:互联网 发布:淘宝卖家延长发货时间 编辑:程序博客网 时间:2024/06/01 09:24

     最近需要用到级联操作,一级菜单和二级菜单的显示,发现Android官方自带了一个控件,ExpandableListView,学了一下用法,还好比较简单,当然也要先写一个自定义的适配器去继承BaseExpandableListAdapter,并实现方法

public class MyAdapter extends BaseExpandableListAdapter{@Overridepublic int getGroupCount() {return 0;}@Overridepublic int getChildrenCount(int groupPosition) {return 0;}@Overridepublic Object getGroup(int groupPosition) {return null;}@Overridepublic Object getChild(int groupPosition, int childPosition) {return null;}@Overridepublic long getGroupId(int groupPosition) {return 0;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return 0;}@Overridepublic boolean hasStableIds() {return false;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {// TODO Auto-generated method stubreturn null;}@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {return null;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return false;}}
     一个个看,getGroupCount就是返回一级菜单的数目,getChildrenCount就是返回当前一级菜单下的二级菜单的数目,getGroup就是返回groupPosition所关联的data,getChild则是返回两个参数下关联的data,getGroupId直接返回groupPosition,getChildId如果没有要求也是直接返回childPosition,getGroupView和getChildView都是设置view显示的样子,可以在xml中自定义,也可以直接在代码中实例化。剩下的hasStableIds和isChildSelectable直接返回true就行。

    如果要展示的数据比较简单只有一项的话可以直接使用list集合,但是如果数据比较多,比如一个子view中同时显示内容和时间两个属性,就需要在list集合中嵌套一个map集合。在使用集合的时候要考虑将group的数据和child的数据关联起来,这样才能联动显示。先假设一个需求,比如qq的联系人界面,一级界面时好友分组,只有一个textview,二级界面做的简陋一点,一个imageview和一个textview,那么我们先开始写布局文件

res/layout/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" >    <TextView        android:id="@+id/group_text"        android:layout_width="match_parent"        android:layout_height="40dp"        android:layout_marginLeft="25dp"        android:textColor="#000000"        android:textSize="18sp" /></LinearLayout>
res/layout/child.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="50dp"    android:gravity="center_vertical"    android:orientation="horizontal" >        <ImageView         android:id="@+id/child_img"        android:layout_marginLeft="20dp"        android:layout_width="40dp"        android:layout_height="40dp"        android:src="@drawable/ic_launcher"/>        <TextView         android:textColor="#111111"        android:id="@+id/child_txt"        android:layout_marginLeft="20dp"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        /></LinearLayout>

在自定义的适配器中实例化

public class MyAdapter extends BaseExpandableListAdapter{private Context mContext;private List<String> mGroups;private List<List<Map<String, Object>>> mChilds;//构造函数中传入上下文对象,group的data,child的datapublic MyAdapter(Context context,List<String> group,List<List<Map<String, Object>>> child){this.mContext = context;this.mGroups = group;this.mChilds = child;}@Overridepublic int getGroupCount() {return mGroups.size();}@Overridepublic int getChildrenCount(int groupPosition) {return mChilds.get(groupPosition).size();}@Overridepublic Object getGroup(int groupPosition) {return mGroups.get(groupPosition);}@Overridepublic Object getChild(int groupPosition, int childPosition) {return mChilds.get(groupPosition).get(childPosition);}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Overridepublic boolean hasStableIds() {return true;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {LinearLayout mLinearGroup = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.group, null);TextView grouptext = (TextView) mLinearGroup.findViewById(R.id.group_text);String text = mGroups.get(groupPosition);grouptext.setText(text);return mLinearGroup;}@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {LinearLayout mLinearChild = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.child, null);ImageView childimg= (ImageView) mLinearChild.findViewById(R.id.child_img);Bitmap bitmap = (Bitmap) mChilds.get(groupPosition).get(childPosition).get("image");childimg.setImageBitmap(bitmap);TextView childtext = (TextView) mLinearChild.findViewById(R.id.child_txt);String text = (String) mChilds.get(groupPosition).get(childPosition).get("text");childtext.setText(text);return mLinearChild;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}}

然后在activity中进行调用

public class MainActivity extends Activity {private ExpandableListView mListView;private MyAdapter mAdapter;List<String> group = null;List<List<Map<String, Object>>> child = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView = (ExpandableListView) findViewById(R.id.expand);initData();mAdapter = new MyAdapter(getApplicationContext(), group, child);mListView.setAdapter(mAdapter);//mListView.setGroupIndicator(null);  //设置箭头消失}/** * 传入测试数据,实际获取方法类似 */private void initData() {group = new ArrayList<String>();group.add("我的好友");group.add("我的家人");group.add("我的同学");Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);child = new ArrayList<List<Map<String,Object>>>();for (int i = 0; i < group.size(); i++) {List<Map<String, Object>> lists = new ArrayList<Map<String,Object>>();for (int j = 0; j < 6; j++) {Map<String, Object> map = new HashMap<String, Object>();map.put("image",bitmap );map.put("text", group.get(i)+j);lists.add(map);}child.add(lists);}}}

效果如下:


源码下载链接:http://download.csdn.net/detail/u013926110/8973617


0 0
原创粉丝点击