Android ExpandableListView简单使用(一)之仿QQ添加分组功能

    xiaoxiao2021-03-25  106

    转载请注明本文出自Xzhi的博客(http://blog.csdn.net/_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<GroupInfo> groupList; /* 二级数据源 */ List<List<ChildInfo>> childList; List<ChildInfo>cList; @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<GroupInfo>(); groupList.add(new GroupInfo("我的好友")); cList = new ArrayList<ChildInfo>(); 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<List<ChildInfo>>(); 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<ChildInfo>(); cList.add(new ChildInfo(string, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))); // childList = new ArrayList<List<ChildInfo>>(); 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<GroupInfo> groupList; /* 二级数据源 */ List<List<ChildInfo>> childList; Context context; public MyAdapter(List<GroupInfo> groupList, List<List<ChildInfo>> 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。 源码点击下载

    赞赏支持

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

    转载请注明原文地址: https://ju.6miu.com/read-22438.html

    最新回复(0)