ExpandableListView
ExpandableListView的例子
1. 定义groupItem和chidrenItem的layout,略;
2. 实现继承BaseExpandableListAdapter的类,如下:
public class MyExpandableListViewAdapter extends BaseExpandableListAdapter { private String[] mGroupTypes = new String[] { "好友", "陌生人", "黑名单" }; private String[][] mGroupMembers = new String[][] { { "好友一", "好友二", "好友三", "好友四", "好友五" }, { "陌生人一", "陌生人二", "陌生人三", "陌生人四", "陌生人五", "陌生人六" }, { "黑名单一", "黑名单二", "黑名单三", "黑名四" } }; private LayoutInflater mLayoutInflater; private OnChildItemClickListener mOnChildItemClickListener; public MyExpandableListViewAdapter(Context context) { mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getGroupCount() { return mGroupTypes.length; } @Override public Object getGroup(int groupPosition) { return mGroupTypes[groupPosition]; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public int getChildrenCount(int groupPosition) { return mGroupMembers[groupPosition].length; } @Override public Object getChild(int groupPosition, int childPosition) { return mGroupMembers[groupPosition][childPosition]; } @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) { GroupViewHolder groupViewHolder; if (convertView == null) { groupViewHolder = new GroupViewHolder(); convertView = mLayoutInflater.inflate(R.layout.groupitem, null); groupViewHolder.mGroupInfo = (TextView) convertView.findViewById(R.id.expandablelistview_groupitem_info); groupViewHolder.mGroupIcon = (ImageView) convertView.findViewById(R.id.expandablelistview_groupitem_icon); convertView.setTag(groupViewHolder); } else { groupViewHolder = (GroupViewHolder) convertView.getTag(); } if (isExpanded) groupViewHolder.mGroupIcon.setImageResource(R.drawable.ic_uparrows); else groupViewHolder.mGroupIcon.setImageResource(R.drawable.ic_downarrows); groupViewHolder.mGroupInfo.setText(mGroupTypes[groupPosition]); return convertView; } private final class GroupViewHolder { TextView mGroupInfo; ImageView mGroupIcon; } @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHolder viewHolder; if (convertView == null) { viewHolder = new ChildViewHolder(); convertView = mLayoutInflater.inflate(R.layout.childitem, null); viewHolder.mChildInfoItem = (RelativeLayout) convertView.findViewById(R.id.paylist_item); viewHolder.mChildItemInfo = (TextView) convertView.findViewById(R.id.paylist_item_goldtv); convertView.setTag(viewHolder); } else { viewHolder = (ChildViewHolder) convertView.getTag(); } viewHolder.mChildItemInfo.setText(mGroupMembers[groupPosition][childPosition]); viewHolder.mChildInfoItem.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mOnChildItemClickListener.onChildItemClicked(groupPosition, childPosition); } }); return convertView; } private final class ChildViewHolder { RelativeLayout mChildInfoItem; TextView mChildItemInfo; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } public interface OnChildItemClickListener { public void onChildItemClicked(int groupPosition, int childPosition); } public void setOnChildItemClickListener(OnChildItemClickListener onChildItemClickListener) { mOnChildItemClickListener = onChildItemClickListener; } }
3. Activity中使用该适配器:
public class MainActivity extends Activity implements OnGroupExpandListener, OnChildItemClickListener{ private ExpandableListView mExpandableListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mExpandableListView = (ExpandableListView) findViewById(R.id.activity_main_expandablelistview); mExpandableListView.setDivider(null); mExpandableListView.setOnGroupExpandListener((OnGroupExpandListener) this); MyExpandableListViewAdapter adapter = new MyExpandableListViewAdapter(this); mExpandableListView.setAdapter(adapter); adapter.setOnChildItemClickListener(this); } @Override public void onGroupExpand(int groupPosition) { for (int i = 0, count = mExpandableListView.getExpandableListAdapter().getGroupCount(); i < count; i++) { if (groupPosition != i) { // 关闭其他分组 mExpandableListView.collapseGroup(i); } } } @Override public void onChildItemClicked(int groupPosition, int childPosition) { Toast.makeText(this, "点击了" + groupPosition + "下的" + childPosition, Toast.LENGTH_SHORT).show(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)