转载请注明本文出自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);
field.set(dialog,
true);
dialog.dismiss();
}
catch (Exception e)
{
e.printStackTrace();
}
}
})
.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 =
new ArrayList<ChildInfo>();
cList.add(
new ChildInfo(string, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)));
childList.add(cList);
adapter.notifyDataSetChanged();
}
else
{
Toast.makeText(MainActivity.
this,
"姓名不能为空",
0).show();
field.set(dialog,
false);
dialog.dismiss();
}
}
catch (Exception e)
{
}
}
}).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);
field.set(dialog,
true);
dialog.dismiss();
}
catch (Exception e)
{
}
}
})
.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();
field.set(dialog,
true);
dialog.dismiss();
}
else
{
field.set(dialog,
false);
dialog.dismiss();
Toast.makeText(MainActivity.
this,
"请输入分组名",
0).show();
}
}
catch (Exception e)
{
}
}
}).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。 源码点击下载
赞赏支持
如果您觉得我的文章对您有帮助的话,请随意打赏。您的支持将鼓励我继续创作!