转载请注明本文出自Xzhi的博客(http://blog.csdn.net/CSDN_zhi/article/details/61200010),请尊重他人的辛勤劳动成果,谢谢!

前言

过几天就要开始物联网比赛了,从百忙之中抽出一点时间总结下在备赛中遇到ExpandableListView的使用。之前也遇到过ExpandableListView,但只是使用SimpleExpandableListAdapter适配器简单的实现。SimpleExpandableListAdapter虽然使用简单,但不适合一些复杂的功能,获取数据源也不方便。比如,我在前天备赛训练中遇到这样的麻烦:Android端从PC端获取数据并以ExpandableListView形式展示,这时候的数据源就不是死的了,SimpleExpandableListAdapter是也可以实现但本人感觉还是相当的麻烦。这就需要用到BaseExpandableListAdapter适配器了。

效果图

我就简单使用BaseExpandableListAdapter实现下仿QQ添加分组功能。
先看下效果图:

xml代码

直接上代码

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"    tools:context=".MainActivity" >    <ImageView        android:id="@+id/add"        android:layout_width="60dp"        android:layout_height="60dp"        android:onClick="add"        android:src="@drawable/add" />    <ExpandableListView        android:id="@+id/expandableListView1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_below="@+id/add"         >    ExpandableListView>    <TextView        android:id="@+id/textView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignBottom="@+id/add"        android:layout_marginBottom="20dp"        android:layout_toRightOf="@+id/add"        android:text="添加分组" />RelativeLayout>

child_item.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/RelativeLayout1"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView        android:id="@+id/cName"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignBottom="@+id/imageView1"        android:layout_marginBottom="32dp"        android:layout_marginLeft="16dp"        android:layout_toRightOf="@+id/imageView1"        android:text="TextView" />    <ImageView        android:id="@+id/imageView1"        android:layout_width="80dp"        android:layout_height="90dp"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"        android:layout_marginLeft="30dp"        android:layout_marginTop="16dp"        android:src="@drawable/ic_launcher" />RelativeLayout>

group_item.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/RelativeLayout1"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView        android:id="@+id/gCount"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignBaseline="@+id/gName"        android:layout_alignBottom="@+id/gName"        android:layout_alignParentRight="true"        android:layout_marginRight="66dp"        android:text="TextView" />    <TextView        android:id="@+id/gName"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"        android:layout_marginLeft="30dp"        android:layout_marginTop="10dp"        android:text="TextView" />RelativeLayout>

java代码

MainActivity.java

public class MainActivity extends Activity{    MyAdapter adapter;    ExpandableListView ep;    /* 一级数据源 */    List groupList;    /* 二级数据源 */    List> childList;    ListcList;    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ep = (ExpandableListView)findViewById(R.id.expandableListView1);        init();        epClick();    }    public void init()    {        groupList = new ArrayList();        groupList.add(new GroupInfo("我的好友"));        cList = new ArrayList();        cList.add(new ChildInfo("张三", BitmapFactory.decodeResource(getResources(), R.drawable.pic6)));        cList.add(new ChildInfo("李四", BitmapFactory.decodeResource(getResources(), R.drawable.pic5)));        cList.add(new ChildInfo("王五", BitmapFactory.decodeResource(getResources(), R.drawable.pic3)));        cList.add(new ChildInfo("小红", BitmapFactory.decodeResource(getResources(), R.drawable.pic4)));        cList.add(new ChildInfo("小花", BitmapFactory.decodeResource(getResources(), R.drawable.pic1)));        cList.add(new ChildInfo("小诗", BitmapFactory.decodeResource(getResources(), R.drawable.pic2)));        childList = new ArrayList>();        childList.add(cList);        adapter = new MyAdapter(groupList, childList, this);        ep.setAdapter(adapter);    }    /**     * ep点击事件     *      * @time 2017-3-10 上午10:55:41     */    public void epClick()    {        ep.setOnItemLongClickListener(new OnItemLongClickListener()        {            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)            {                final EditText editText = new EditText(MainActivity.this);                editText.setHint("请输入姓名");                new AlertDialog.Builder(MainActivity.this)                .setTitle("添加好友")                .setView(editText)                .setNegativeButton("取消", new OnClickListener()                {                    public void onClick(DialogInterface dialog, int which)                    {                        try                        {                            /** 利用反射技术不关闭对话框 */                            Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");                            field.setAccessible(true);                            // true 为关闭                            field.set(dialog, true);                            dialog.dismiss();                        }                        catch (Exception e)                        {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                        // TODO Auto-generated method stub                    }                })                .setPositiveButton("确定", new OnClickListener()                {                    public void onClick(DialogInterface dialog, int which)                    {                        Field field = null;                        try                        {                            field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");                            field.setAccessible(true);                            String string = editText.getText().toString();                            if (!(string.equals("")))                            {                                field.set(dialog, true);                                dialog.dismiss();//                              cList.clear();                                cList = new ArrayList();                                cList.add(new ChildInfo(string, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)));//                              childList = new ArrayList>();                                childList.add(cList);                                adapter.notifyDataSetChanged();                            }                            else                            {                                Toast.makeText(MainActivity.this, "姓名不能为空", 0).show();                                field.set(dialog, false);                                dialog.dismiss();                            }                        }                        catch (Exception e)                        {                            // TODO: handle exception                        }                    }                }).show();                return false;            }        });    }    public void add(View v)    {        final EditText editText = new EditText(this);        editText.setHint("请输入分组名");        new AlertDialog.Builder(this)        .setTitle("添加分组")        .setView(editText)        .setNegativeButton("取消", new OnClickListener()        {            public void onClick(DialogInterface dialog, int which)            {                try                {                    Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");                    field.setAccessible(true);                    // 为true,表示关闭对话框                    field.set(dialog, true);                    dialog.dismiss();                }                catch (Exception e)                {                    // TODO: handle exception                }            }        })        .setPositiveButton("确定", new OnClickListener()        {            public void onClick(DialogInterface dialog, int which)            {                Field field = null;                try                {                    /** 利用反射技术不关闭对话框 */                    field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");                    field.setAccessible(true);                    String string = editText.getText().toString();                    if (!(string.equals("")))                    {                        groupList.add(new GroupInfo(string));                        adapter.notifyDataSetChanged();                        // 为true,表示关闭对话框                        field.set(dialog, true);                        dialog.dismiss();                    }                    else                    {                        // 为false,表示不关闭对话框                        field.set(dialog, false);                        dialog.dismiss();                        Toast.makeText(MainActivity.this, "请输入分组名", 0).show();                    }                }                catch (Exception e)                {                    // TODO: handle exception                }            }        }).show();    }}

MyAdapter.java

public class MyAdapter extends BaseExpandableListAdapter{    /* 一级数据源 */    List groupList;    /* 二级数据源 */    List> childList;    Context context;    public MyAdapter(List groupList, List> childList, Context context)    {        super();        this.groupList = groupList;        this.childList = childList;        this.context = context;    }    class GroupView    {        TextView groupName;        TextView count;    }    class ChildView    {        ImageView pic;        TextView childName;    }    /********************* Group ************************/    public int getGroupCount()    {        return groupList.size();    }    public Object getGroup(int groupPosition)    {        return groupList.get(groupPosition);    }    public long getGroupId(int groupPosition)    {        return groupPosition;    }    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)    {        GroupView gView = null;        if (convertView == null)        {            gView = new GroupView();            convertView = LayoutInflater.from(context).inflate(R.layout.group_item, null);            gView.groupName = (TextView) convertView.findViewById(R.id.gName);            gView.count = (TextView) convertView.findViewById(R.id.gCount);            convertView.setTag(gView);        }        else        {            gView = (GroupView) convertView.getTag();        }        GroupInfo groupInfo = groupList.get(groupPosition);        gView.groupName.setText(groupInfo.getName());        if(groupPosition==0)        {            gView.count.setText(""+childList.get(groupPosition).size());        }        else        {            gView.count.setText("0");        }        return convertView;    }    /**************************** Child ***************************/    int i = 0;    public int getChildrenCount(int groupPosition)    {        if(groupPosition == 0)        {            i = childList.get(groupPosition).size();        }        else        {            Toast.makeText(context, "长按添加好友", 0).show();            i = 0;        }        return i;    }    public Object getChild(int groupPosition, int childPosition)    {        return childList.get(groupPosition).get(childPosition);    }    public long getChildId(int groupPosition, int childPosition)    {        return childPosition;    }    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)    {        ChildView cView = null;        if (convertView == null)        {            cView = new ChildView();            convertView = LayoutInflater.from(context).inflate(R.layout.child_item, null);            cView.childName = (TextView) convertView.findViewById(R.id.cName);            cView.pic = (ImageView) convertView.findViewById(R.id.imageView1);            convertView.setTag(cView);        }        else        {            cView = (ChildView) convertView.getTag();        }        ChildInfo childInfo = childList.get(groupPosition).get(childPosition);        cView.pic.setImageBitmap(childInfo.getChildPic());        cView.childName.setText(childInfo.getChildName());        return convertView;    }    public boolean hasStableIds()    {        return false;    }    public boolean isChildSelectable(int groupPosition, int childPosition)    {        return false;    }}

ChildInfo.java

/** *  * @function Child实体类 * @author Xzhi * @time 2017-3-10 上午10:00:41 * Copyright (c) 2017 Xzhi All Rights Reserved. * */public class ChildInfo{    String childName;    Bitmap childPic;    public ChildInfo(String childName, Bitmap childPic)    {        super();        this.childName = childName;        this.childPic = childPic;    }    public String getChildName()    {        return childName;    }    public void setChildName(String childName)    {        this.childName = childName;    }    public Bitmap getChildPic()    {        return childPic;    }    public void setChildPic(Bitmap childPic)    {        this.childPic = childPic;    }}

GroupInfo.java

/** *  * @function Group实体类 * @author Xzhi * @time 2017-3-10 上午9:55:41  * Copyright (c) 2017 Xzhi All Rights Reserved. * */public class GroupInfo{    String name;    int count;    public GroupInfo(String name)    {        super();        this.name = name;        this.count = count;    }    public String getName()    {        return name;    }    public void setName(String name)    {        this.name = name;    }    public int getCount()    {        return count;    }    public void setCount(int count)    {        this.count = count;    }}

上面代码很简单就不需要解释了 。
由于时间比较紧迫,所以【添加好友】这个功能还没实现,打算比完赛后再将它实现。
如果项目对您有帮助,欢迎大家在github上Star我的项目,当然如果大家有什么建议欢迎留言或fork。
源码点击下载

赞赏支持

如果您觉得我的文章对您有帮助的话,请随意打赏。您的支持将鼓励我继续创作!

更多相关文章

  1. 自定义Dialog之信息提示
  2. Android(安卓)如何监听返回键,弹出一个退出对话框
  3. 【Android】第6章(5) DatePickerDialog和TimePickerDialog
  4. android中控制AlertDialog的关闭
  5. AndroidのActivity跳转数据通信和跳转动画
  6. (20120731)Android中的各种对话框总结(dialog)
  7. java.lang.RuntimeException: Unable to start receiver com.yel
  8. Android学习笔记(1)————Android四大组件之一(Activity)
  9. Android学习备忘002——ListView/GridView&BaseAdapter

随机推荐

  1. android 编程基础
  2. cocos2dx打包Android出现“未指定Android
  3. Android单元测试(七):Robolectric,在JVM上调
  4. Android多分辨率适配框架(1)— 核心基础
  5. Android(安卓)Studio3.3打开Android(安卓
  6. android:radius设置圆角失败的问题
  7. Android进阶——Android视图工作机制之me
  8. Android 模拟器安装及使用教程
  9. Android软件的自动更新
  10. 欢迎进入Android的世界