ExpandableListView多级列表(二级列表)
2017-06-13 16:05
363 查看
今天研究下ExpandableListView 多级列表的用法,先来看看效果图:
我们分析下效果图:
1.效果图中左边是一个ListView ,右边是一个ExpandableListView ,并且左右联动,点击左边右边也会相应的发生变化。
2.右边ExpandableListView 是一个二级列表(这篇文章我们先介绍二级列表,三级列表或四级列表以后介绍),点击一级列表会展开二级列表。其主要实现的控件就是ExpandableListView
1.先看下布局文件xml :
2.看下代码: 先看下主类
先看下ListVIew 的Adapter
再看下ExpandableListView的Adapter
http://blog.csdn.net/wangkeke1860/article/details/46477361
我们分析下效果图:
1.效果图中左边是一个ListView ,右边是一个ExpandableListView ,并且左右联动,点击左边右边也会相应的发生变化。
2.右边ExpandableListView 是一个二级列表(这篇文章我们先介绍二级列表,三级列表或四级列表以后介绍),点击一级列表会展开二级列表。其主要实现的控件就是ExpandableListView
1.先看下布局文件xml :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="@color/color_bg_selected"> <ImageView android:id="@+id/ib_back" android:layout_width="45dp" android:layout_height="48dp" android:layout_marginLeft="5dp" android:padding="15dp" android:scaleType="centerInside" android:src="@drawable/back" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="全部分类" android:textColor="@color/white" android:textSize="@dimen/titlebar_title_tv_size" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ListView android:id="@+id/listView" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginLeft="4dp" android:layout_weight="2" android:background="@color/white" android:choiceMode="singleChoice" android:divider="@color/tv_f3" android:listSelector="#00000000" android:scrollbars="none"> </ListView> <ExpandableListView android:id="@+id/expendlistview" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3" android:numColumns="2" android:layout_marginTop="10dp" android:horizontalSpacing="8dp" android:verticalSpacing="8dp" android:layout_marginLeft="10dp" android:divider="@null" android:layout_marginRight="10dp" android:scrollbars="none"> </ExpandableListView> </LinearLayout> </LinearLayout>通过布局文件我们可以看到,左边是listView ,右边是ExpandableListView.
2.看下代码: 先看下主类
/** * Created by FanHaiChao on 2017/2/10. * 需求类目的分类列表 */ public class DemandClassifyActivity extends BaseActivity { private ImageView ib_back; private ListView listView; private ExpandableListView expendlistview; private DemandClassifyBean demandClassifyBean; private DemandExpandAdapter demandExpandAdapter; private DemandClassifyFirstAdapter firstAdapter; @Override public int getLayoutResId() { return R.layout.activity_demand_classify; } @Override protected void initView() { ib_back = (ImageView) findViewById(R.id.ib_back); listView = (ListView) findViewById(R.id.listView); expendlistview = (ExpandableListView) findViewById(R.id.expendlistview); //取消默认的左边的上下翻箭头 expendlistview.setGroupIndicator(null); } @Override protected void initListener() { ib_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); //左边ListView 的点击事件,关联右边的多级列表 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //点击ListView的条目,展示与LIstView中该条目对应的ExpandableListView的列表 demandExpandAdapter = new DemandExpandAdapter(activity,demandClassifyBean.classList.get(position).dataList); expendlistview.setAdapter(demandExpandAdapter); for(int i = 0; i < demandExpandAdapter.getGroupCount(); i++){ expendlistview.expandGroup(i);//多级列表初始化展开状态 // expendlistview.collapseGroup(i);//关闭 } firstAdapter.setSelectedPosition(position);//设置选中的条目 firstAdapter.notifyDataSetInvalidated(); } }); } @Override protected void initData() { if (demandClassifyBean != null){ List<DemandClassifyBean.ClassListBean> classFirstList = demandClassifyBean.classList; //ListView 的Adapter firstAdapter = new DemandClassifyFirstAdapter(activity,classFirstList); listView.setAdapter(firstAdapter); if (demandClassifyBean.classList != null && demandClassifyBean.classList.size() != 0) { //Expandable 的Adapter ,get(0).dataList 默认展示ListView中第一个条目对应的ExpandableListView列表。 demandExpandAdapter = new DemandExpandAdapter(activity, demandClassifyBean.classList.get(0).dataList); expendlistview.setAdapter(demandExpandAdapter); for(int i = 0; i < demandExpandAdapter.getGroupCount(); i++){ expendlistview.expandGroup(i);//多级列表初始化展开状态 // expendlistview.collapseGroup(i);//多级列表初始关闭状态 } } }else { onLoad(); } } /** * 获取需求类目 */ private void onLoad(){ ServiceApi.getDemandClasses(new MyString2Callback() { @Override public void onError(Call call, Exception e) { ToastUtils.showInternetErrorToast(); } @Override public void onResponse(Call call, String s) { // TODO: 2017/2/9 demandClassifyBean = new Gson().fromJson(s,DemandClassifyBean.class); if (demandClassifyBean.code == 0){ initData(); }else { ToastUtils.showToast(demandClassifyBean.msg); } } }); } }2.之后我们看一下adapter 的代码
先看下ListVIew 的Adapter
/** * Created by FanHaiChao on 2017/2/10. * 需求类目一级 */ public class DemandClassifyFirstAdapter extends BaseAdapter { private List<DemandClassifyBean.ClassListBean> list; Activity activity; LayoutInflater inflater; private int selectedPosition = 0; public DemandClassifyFirstAdapter(Activity activity, List<DemandClassifyBean.ClassListBean> list) { this.activity = activity; this.list = list; inflater = LayoutInflater.from(activity); } @Override public int getCount() { return list.size(); } @Over 4000 ride public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = inflater.inflate(R.layout.item_demand_classify_left, null); holder = new ViewHolder(); holder.textView = (TextView) convertView.findViewById(R.id.textview); holder.colorlayout = (LinearLayout) convertView.findViewById(R.id.colorlayout); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 设置选中效果 if (selectedPosition == position) { holder.textView.setTextColor(Color.parseColor("#ff8400")); holder.colorlayout.setBackgroundColor(Color.parseColor("#fff3f3f3")); } else {//默认效果 holder.textView.setTextColor(Color.BLACK); holder.colorlayout.setBackgroundColor(Color.WHITE); } holder.textView.setText(list.get(position).CLASS_NAME.trim()); return convertView; } public static class ViewHolder { public TextView textView; public LinearLayout colorlayout; } //设置选中的条目 public void setSelectedPosition(int position) { selectedPosition = position; } }
再看下ExpandableListView的Adapter
/** * Created by FanHaiChao on 2017/2/10. * * 需求管理二三级菜单 */ public class DemandExpandAdapter extends BaseExpandableListAdapter { private List<DemandClassifyBean.ClassListBean.DataListBeanX> groupData; private Activity activity; public DemandExpandAdapter(Activity activity, List<DemandClassifyBean.ClassListBean.DataListBeanX> groupData) { this.activity = activity; this.groupData = groupData; } @Override public int getGroupCount() { return groupData.size();//一级列表数量 } @Override public int getChildrenCount(int groupPosition) { return groupData.get(groupPosition).dataList == null ? 0:groupData.get(groupPosition).dataList.size();//二级列表数量 } @Override public Object getGroup(int groupPosition) { return groupData.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return groupData.get(groupPosition).dataList.get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override // 按函数的名字来理解应该是是否具有稳定的id,这个方法目前一直都是返回false,没有去改动过 public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupHolder groupHolder; if (convertView == null){ convertView = LayoutInflater.from(activity).inflate(R.layout.item_demand_classify_group,null); groupHolder = new GroupHolder(); groupHolder.tv_item = (TextView) convertView.findViewById(R.id.tv_item); convertView.setTag(groupHolder); }else { groupHolder = (GroupHolder) convertView.getTag(); } groupHolder.tv_item.setText(groupData.get(groupPosition).CLASS_NAME); if (isExpanded){ //一级条目展开和关闭展示的不同颜色 groupHolder.tv_item.setSelected(true); }else { groupHolder.tv_item.setSelected(false); } return convertView; } @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildHolder childHolder; if (convertView == null){ convertView = LayoutInflater.from(activity).inflate(R.layout.item_demand_classify_expand,null); childHolder = new ChildHolder(); childHolder.tv_item = (TextView) convertView.findViewById(R.id.tv_item); convertView.setTag(childHolder); }else { childHolder = (ChildHolder) convertView.getTag(); } childHolder.tv_item.setText(groupData.get(groupPosition).dataList.get(childPosition).CLASS_NAME); //二级列表条目点击事件,返回数据 childHolder.tv_item.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("id",groupData.get(groupPosition).dataList.get(childPosition).ID); intent.putExtra("name",groupData.get(groupPosition).dataList.get(childPosition).CLASS_NAME); activity.setResult(Activity.RESULT_OK,intent); activity.finish(); } }); return convertView; } @Override // 子项是否可选中,如果需要设置子项的点击事件,需要返回true public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private class GroupHolder{ TextView tv_item; } private class ChildHolder{ TextView tv_item; } }详细的介绍在代码中已经介绍了,我就不在一一介绍了,不了解的请参阅:http://blog.csdn.net/shexiaoheng/article/details/41351247
http://blog.csdn.net/wangkeke1860/article/details/46477361
相关文章推荐
- Android_ExpandableListView_一个ListView实现二级列表
- ExpandableListView二级列表购物车,MVP获取数据
- ExpandableListView_二级列表(数据是用TypeToken解出来的【外层是集合】)
- Android UI开发第二篇——多级列表(ExpandableListView)
- ExpandableListView (二级列表)使用demo
- 二级列表ExpandableListView
- 二级列表 ExpandableListView
- 二级列表ExpandableListView的使用
- ExpandableListView 二级列表
- ExpandableListView 根据输入的名称搜索对应的内容并展示,点击可打开二级列表
- Android::ExpandableListView二级列表控件的使用
- ExpandableListView 二级展开列表
- ExpandableListView+Dialog实现弹出二级下拉列表选项。可自由用于Activity和Fragment中
- PinnedHeaderExpandableListView,可固定顶部标题的二级列表菜单
- 二级列表ExpandableListView 仿京东购物车
- Android电商项目 ExpandableListView(二级列表)实现购物车(高仿淘宝) demo
- 二级列表ExpandableListView
- 实现ExpandableListView 二级列表,点击二级条目状态的改变
- Android UI开发第二篇——多级列表(ExpandableListView)
- android端获取网络数据添加到二级列表ExpandableListView