ExpandableListView的使用
来源:互联网 发布:java future isdone 编辑:程序博客网 时间:2024/05/28 15:02
对于我来说ExpandableListView我是最近才开始有所了解,之前都是用ListView或者RecyclerView,有的时候根据特定的需求自定义一些ListView。但如果项目中有类似QQ好友分组这样的效果时,ExpandableListView真的是特别方便。ExpandableListView是一个用来显示二级节点的listview。默认展示的是第一级的分组,点击某个分组后会展开该分组下的子列表。下面先给大家看一下我写的demo里面的效果,可能界面不是很好看,但是效果时完全可以展示给大家看的。
下面是主要实现:
这个页面就是要显示的主页面,里面就放了一个ExpandableListView;
<?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" android:orientation="vertical"> <!--childDivider 代表子列表的分割线 --> <!--divider 代表组列表的分割线 --> <ExpandableListView android:id="@+id/expand_list" android:layout_width="match_parent" android:layout_height="match_parent" android:childDivider="@drawable/aliwx_common_double_line" android:divider="@drawable/aliwx_common_double_line" /></LinearLayout>
下面是每个item的布局:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="70dp"> <ImageView android:id="@+id/iv" android:layout_width="50dp" android:layout_height="50dp" android:layout_centerVertical="true" android:src="@mipmap/ic_launcher" android:layout_marginLeft="20dp"/> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/iv" android:layout_marginLeft="10dp" android:layout_centerVertical="true" android:textSize="18sp" android:text="张三"/></RelativeLayout>
以下是Activity里面的代码,Adapter我采用的是内部类:
public class OtherActivity extends AppCompatActivity { private ExpandableListView mExpandableListView; private List<String> groupList; private List<String> childList; private List<List<String>> itemList; private List<Integer> groupImg; private List<Integer> childImg; private List<List<Integer>> itemImg; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_other); mExpandableListView = (ExpandableListView) findViewById(R.id.expand_list); groupList = new ArrayList<>(); groupList.add("我的好友"); groupList.add("同学"); groupList.add("同事"); groupList.add("家人"); groupList.add("陌生人"); childList = new ArrayList<>(); childList.add("张三"); childList.add("李四"); childList.add("王五"); itemList = new ArrayList<>(); for (int i = 0; i < groupList.size(); i++) { itemList.add(childList); } groupImg = new ArrayList<>(); for (int i = 0; i < groupList.size(); i++) { groupImg.add(R.drawable.ic_play_action_normal); } childImg = new ArrayList<>(); for (int i = 0; i < childList.size(); i++) { childImg.add(R.mipmap.ic_launcher); } itemImg = new ArrayList<>(); for (int i = 0; i < groupImg.size(); i++) { itemImg.add(childImg); } //mExpandableListView组点击监听 默认返回false,若每个组里面的子列表如果是空就返回true,代表不展开 mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) { Toast.makeText(OtherActivity.this, "group = " + i, Toast.LENGTH_SHORT).show(); if (itemList.get(i).isEmpty()){ return true; } return false; } }); //mExpandableListView子列表点击监听时间,返回false代表可以被点击 mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) { Toast.makeText(OtherActivity.this, "group = " + i +"child = " + i1, Toast.LENGTH_SHORT).show(); return false; } }); mExpandableListView.setAdapter(new MyExpandableAdapter(this)); //设置为null代表去除ExpandableListView自带的指示器,可以自己定义一个指示器 mExpandableListView.setGroupIndicator(null); //默认展开第几组 mExpandableListView.expandGroup(0); } class MyExpandableAdapter extends BaseExpandableListAdapter{ private Context context; public MyExpandableAdapter(Context context){ this.context = context; } /** *返回组的数目 * 运用三目运算符是防止我们在网络请求的时候获取到的数据可能为null */ @Override public int getGroupCount() { return groupList.size() > 0 ? groupList.size() : 0; } /** *返回指定组中子列表的数目 */ @Override public int getChildrenCount(int i) { return itemList.get(i).size() > 0 ? itemList.get(i).size() : 0; } /** *返回指定组中的数据 */ @Override public Object getGroup(int i) { return groupList.get(i); } /** *返回指定组中指定子列表中的数据 */ @Override public Object getChild(int i, int i1) { return itemList.get(i).get(i1); } /** *返回组指定组中的id */ @Override public long getGroupId(int i) { return i; } /** *返回指定组中指定子列表的id */ @Override public long getChildId(int i, int i1) { return i1; } /** *组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。 */ @Override public boolean hasStableIds() { return true; } /** * 获取显示指定组的视图对象 * @param i 组位置 * @param b 是否展开 * @param view 重用已有的视图对象 * @param viewGroup 返回的视图对象始终依附于的视图组 * @return */ @Override public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { GroupHolder groupHolder = null; if (view == null){ view = LayoutInflater.from(context).inflate(R.layout.expandable_group,null); groupHolder = new GroupHolder(); groupHolder.ivGroup = (ImageView) view.findViewById(R.id.src); groupHolder.tvGroup = (TextView) view.findViewById(R.id.tv_name); view.setTag(groupHolder); }else { groupHolder = (GroupHolder) view.getTag(); } if (! b ){ groupHolder.ivGroup.setImageResource(groupImg.get(i)); }else { groupHolder.ivGroup.setImageResource(R.drawable.ic_play_action_up); } groupHolder.tvGroup.setText(groupList.get(i)); return view; } /** * 获取一个视图对象,显示指定组中的指定子元素的视图。 * @param i 组位置 * @param i1 子列表位置 * @param b 子元素是否处于组中的最后一个 * @param view 重用已有的视图(View)对象 * @param viewGroup 返回的视图(View)对象始终依附于的视图组 * @return */ @Override public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) { ChildHolder childHolder = null; if (view == null){ view = LayoutInflater.from(context).inflate(R.layout.expandable_child,null); childHolder = new ChildHolder(); childHolder.ivHeader = (ImageView) view.findViewById(R.id.iv); childHolder.tvChild = (TextView) view.findViewById(R.id.tv); view.setTag(childHolder); }else { childHolder = (ChildHolder) view.getTag(); } childHolder.ivHeader.setImageResource(itemImg.get(i).get(i1)); childHolder.tvChild.setText(itemList.get(i).get(i1)); return view; } /** * 是否选中指定位置上的子元素。 * @param i * @param i1 * @return */ @Override public boolean isChildSelectable(int i, int i1) { return true; } } class GroupHolder{ public TextView tvGroup; public ImageView ivGroup; } class ChildHolder{ public TextView tvChild; public ImageView ivHeader; }}
刚开始做demo的时候对于里面的有些方便不是很明白,感谢http://blog.csdn.net/wangkeke1860/article/details/46477361的文章帮我解决了很多疑惑。
0 0
- ExpandableListView的使用
- ExpandableListView的使用
- Android ExpandableListView的使用
- Android ExpandableListView的使用
- 转载:ExpandableListView的使用
- ExpandableListView的使用
- expandablelistview的使用
- Android ExpandableListView的使用
- ExpandableListView组件的使用
- ExpandableListView的基本使用
- ExpandableListView的使用
- ExpandableListView的使用示例
- ExpandableListView的使用
- ExpandableListView的使用总结
- Android ExpandableListView的使用
- ExpandableListView的使用
- Android ExpandableListView的使用
- ExpandableListview的使用介绍
- Android使用Handler防止内存泄漏
- 几个常用机器学习算法 - 决策树算法
- requirejs前端模块化
- linux 虚拟内存初识
- android 判断是否在主线程的方法
- ExpandableListView的使用
- Linux学习笔记之系统中的分区和文件系统
- Lesson 9 Nehe
- 两栈共用同一存储空间
- Field类详解
- Android Studio2.2 配置NDK
- Matlab 矩阵 A ,矩阵 B,求A(B)
- 获取 Android Studio 中的jar包
- idea服务器激活