ExpandableListview的三级列表的数据加载及刷新
来源:互联网 发布:复杂网络节点介数 编辑:程序博客网 时间:2024/05/20 03:44
一、ExpandableListView初识
之前对于ExpandableListView的理解并不是很了解,由于最近的项目需要用到才开始认真的去查看下相关的知识,其实 ExpandableListView类似于listview,它同样也有自己的布局适配器,也同样有getView和getConunt方法,可以这么理解,ExpandableListView两个listview的结合,嵌套而已
二、ExpandableListView的初步使用
ExpandableListView有一级适配器和二级适配器,我们来看看一级适配器的代码:
public class ParentAdapter extends BaseExpandableListAdapter{ private Realm realm; private Context mContext; private List<ParentEntity> parents; private List<ParentAdapterEntity> childAdapterLists; public ParentAdapter(Context mContext, List<ParentEntity> parents, Realm realm, List<ParentAdapterEntity> childAdapterLists) { this.mContext = mContext; this.parents = parents; this.realm = realm; this.childAdapterLists = childAdapterLists; } public void setData(List<ParentEntity> parents, List<ParentAdapterEntity> childAdapterLists) { this.parents = parents; this.childAdapterLists = childAdapterLists; notifyDataSetChanged(); } public List<ParentEntity> getData(){ return parents; } public List<ParentAdapterEntity> getAdapterList(){ return childAdapterLists; } @Override public int getGroupCount() { return parents != null ? parents.size() : 0; } @Override public int getChildrenCount(int groupPosition) { return parents.get(groupPosition).getChilds() != null ? parents .get(groupPosition).getChilds().size() : 0; } @Override public ParentEntity getGroup(int groupPosition) { return parents.get(groupPosition); } @Override public ChildEntity getChild(int groupPosition, int childPosition) { return parents.get(groupPosition).getChilds().get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return true; } /** * 根布局 * @param groupPosition * @param isExpanded * @param convertView * @param parent * @return */ @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupHolder holder = null; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.parent_group_item, null); holder = new GroupHolder(convertView); convertView.setTag(holder); } else { holder = (GroupHolder) convertView.getTag(); } if(!isExpanded){ holder.parentGroup_iv.setBackgroundResource(R.mipmap.img_fangda); }else{ holder.parentGroup_iv.setBackgroundResource(R.mipmap.img_suoxiao); } holder.update(parents.get(groupPosition),groupPosition); return convertView; } /** * 子列表的布局 * @param groupPosition * @param childPosition * @param isLastChild * @param convertView * @param parent * @return */ @Override public View getChildView(final int groupPosition, final int childPosition, final boolean isLastChild, View convertView, ViewGroup parent) { final ExpandableListView eListView = getExpandableListView(); final ArrayList<ChildEntity> childs = new ArrayList<ChildEntity>(); final ChildEntity child = getChild(groupPosition, childPosition); childs.add(child); final ChildAdapter childAdapter = new ChildAdapter(this.mContext, childs); childAdapterLists.get(groupPosition).getChildAdapterEntitys().get(childPosition).setChildAdapter(childAdapter); //存储每一个adapter用来刷新 eListView.setAdapter(childAdapter); eListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPos, long id) { } }); /** * 设置子列表的条目点击事件 * 点击子列表时,调用回调接口 */ eListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupIdex, int childIdex, long id) { } }); childAdapterLists.get(groupPosition).getChildAdapterEntitys().get(childPosition).seteListView(eListView); return eListView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } /** * getchildview中动态创建子ExpandableListView * @return */ public ExpandableListView getExpandableListView() { final CustomExpandableListView mExpandableListView = new CustomExpandableListView(mContext); mExpandableListView.setPadding(20,0,0,0); mExpandableListView.setGroupIndicator(null);// 取消展开折叠的指示图标 return mExpandableListView; } /** * 根布局的viewholder */ class GroupHolder { private TextView parentGroupTV; private ImageView parentGroup_iv; private ImageView iv_parent_run; public GroupHolder(View v) { parentGroupTV = (TextView)v.findViewById(R.id.parentGroupTV); parentGroup_iv = (ImageView)v.findViewById(R.id.parentGroup_iv); iv_parent_run = (ImageView)v.findViewById(R.id.iv_parent_run); } public void update(ParentEntity model, int groupPosition) { parentGroupTV.setText(model.getGroupName()); parentGroupTV.setTextColor(Color.parseColor("#6F6F6F")); if (null != model.getChilds() && model.getChilds().size()>0){ if (model.getChilds().get(0).getChildTaskBean().get(0).isParentRun()){ iv_parent_run.setVisibility(View.VISIBLE); }else{ iv_parent_run.setVisibility(View.INVISIBLE); } }else{ RealmResults<ParentEntity> where = realm.where(ParentEntity.class).findAll(); for (ParentEntity parentEntity:where) { if (model.getGroupName().equals(parentEntity.getGroupName())){ if (parentEntity.getChilds().get(0).getChildTaskBean().get(0).isParentRun()){ iv_parent_run.setVisibility(View.VISIBLE); }else{ iv_parent_run.setVisibility(View.INVISIBLE); } break; } } } } }
核心代码在于getGroupView和getChildView,三级列表的话在getchildVie中在取创建新的ExpandableListView,然后给当前这个二级条目的ExpandableListView设置他的adpter,这样childadapter的使用就在这里了,我们看下面的核心代码:
/** * 第二层布局 * @param groupPosition * @param isExpanded * @param convertView * @param parent * @return */ @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupHolder holder = null; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.child_group_item, null); holder = new GroupHolder(convertView); convertView.setTag(holder); } else { holder = (GroupHolder) convertView.getTag(); } if(!isExpanded){ holder.childGroup_iv.setBackgroundResource(R.mipmap.img_fangda); }else{ holder.childGroup_iv.setBackgroundResource(R.mipmap.img_suoxiao); } holder.update(mChilds.get(groupPosition)); return convertView; } /** * 第三层布局 * @param groupPosition * @param childPosition * @param isLastChild * @param convertView * @param parent * @return */ @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildHolder holder = null; if (convertView == null) { convertView =LayoutInflater.from(mContext).inflate(R.layout.child_child_item, null); holder = new ChildHolder(convertView); convertView.setTag(holder); } else { holder = (ChildHolder) convertView.getTag(); } TaskBean taskBean = mChilds.get(groupPosition).getChildTaskBean().get(childPosition); holder.update(taskBean); return convertView; }
在三级列表的实现过程中,项目的需求是要求点击条目后,将当前条目的颜色改变,当时思考这个问题后,考虑定义一个专门用来存放adpter三级集合,分别对应数据集合的每一条数据,这样一来当我们想要刷新某一个条目的时候,我们通过记录当前点击的条目的position,(一级,二级,三级的position)adpter集合找出点击的适配器后,改变对象的颜色,然后调用刷新,还要将上一个点击的颜色修改回来,这里同样也要记录上一个点击的条目,也是调用adpter刷新;还有一个重点就是ExpandableListView调用setOnGroupClickListener的时候,方法会有一个返回boolean值,如果返回true,那么条目将不可展开,这个我们要是想动态的不想展开,可以自己在代码中动态输入后改变;
0 0
- ExpandableListview的三级列表的数据加载及刷新
- ExpandableListView三级列表的实现
- ExpandableListView多及列表(三级列表)
- ExpandableListView的加载对象数据
- ExpandableListView使用解析(三级列表的实现)
- 带有下拉刷新和上拉加载的的ExpandableListView
- Android_支持下拉刷新和加载更多的ExpandableListView
- Android之用 ExpandableListView使用解析(三级列表的实现)
- android ExpandableListView三级菜单的使用
- 超级吊的ExpandableListView三级目录
- android ExpandableListView三级菜单的使用
- Android多级列表动态加载(三级及三级以上)
- 关于ExpandableListView刷新的解决办法
- 关于ExpandableListView刷新的解决办法
- 城市的三级列表
- 城市的三级列表
- bootstraptable的加载刷新数据
- 多级列表的学习:ExpandableListView
- Docker的理解
- 2种方式进行Spinner数据的添加
- CodeForces
- 杭电ACM刷题(2):1005,Number Sequence
- ElasticsearchCRUD使用(十二)【Elasticsearch的German分析器】
- ExpandableListview的三级列表的数据加载及刷新
- Problem A: 动态规划基础题目之数字三角形
- 输出结果的优先级与变量提升
- C语言通过线程实现回调机制
- DOM对象对xml文件的读取和写入
- PAT-A-1022. Digital Library (30)
- java基础知识(八)
- MySQL索引概貌
- 原子操作