经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
完美实现ExpandableListView二级分栏效果
来源:jb51  时间:2018/11/22 9:59:11  对本文有异议

本文实例为大家分享了ExpandableListView二级分栏效果的具体代码,供大家参考,具体内容如下

对ExpandableListView控件进行封装(未自定义)直接上代码:

通用ViewHolder类,仅在setImageResource中添加代码

  1. package com.svp.haoyan.expandablelistview.tool;
  2.  
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.util.SparseArray;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.ImageView;
  10. import android.widget.TextView;
  11.  
  12. /**
  13. * Created by haoyan on 2016/3/24.
  14. */
  15. public class ViewHolder {
  16. //存储数据
  17. private SparseArray<View> mViews;
  18.  
  19. private int mPosition;
  20. private View mConvertView;
  21. private boolean misExpanded;
  22. public ViewHolder(Context context, ViewGroup parent, int layoutId, int position,boolean isExpanded) {
  23.  
  24. this.mPosition=position;
  25. this.mViews= new SparseArray<View>();
  26. this.misExpanded=isExpanded;
  27. //三
  28. mConvertView= LayoutInflater.from(context).inflate(layoutId,parent,false);
  29. //一
  30. mConvertView.setTag(this);
  31. }
  32. public static ViewHolder get(Context context,View convertView,
  33. ViewGroup parent,int layoutId,int position,boolean isExpanded){
  34.  
  35. if (convertView==null){
  36. return new ViewHolder(context,parent,layoutId,position,isExpanded);
  37. }else {
  38. //五 六
  39. ViewHolder holder=(ViewHolder)convertView.getTag();
  40. holder.mPosition=position;
  41. return holder;
  42. }
  43. }
  44. //通过viewId获取控件
  45. //泛型T返回子类
  46. public <T extends View> T getView(int viewId){
  47.  
  48. View view =mViews.get(viewId);
  49. if (view==null){
  50. //四
  51. view=mConvertView.findViewById(viewId);
  52. mViews.put(viewId,view);
  53. }
  54. return (T)view;
  55. }
  56. //八
  57. public View getmConvertView() {
  58. return mConvertView;
  59. }
  60.  
  61. /**
  62. * 设置TextView的值
  63. * @param viewId
  64. * @param text
  65. * @return
  66. */
  67. //四 七 九
  68. public ViewHolder setText(int viewId,String text){
  69. TextView tv= getView(viewId);
  70. tv.setText(text);
  71. return this;
  72. }
  73. /**
  74. * 一参传id,二参传图片地址,三参为true则调用点击变化效果,默认为false.
  75. * */
  76. public ViewHolder setImageResource(int viewId,int resId,boolean expanded){
  77. ImageView view= getView(viewId);
  78. view.setImageResource(resId);
  79. if (expanded){
  80. if (misExpanded){
  81. view.setVisibility(View.GONE);
  82. }else {
  83. view.setVisibility(View.VISIBLE);
  84. }
  85. }
  86. return this;
  87. }
  88. public ViewHolder setImageBitamp(int viewId,Bitmap bitmap){
  89. ImageView view= getView(viewId);
  90. view.setImageBitmap(bitmap);
  91. return this;
  92. }
  93. public ViewHolder setImageURI(int viewId,String uri){
  94. ImageView view= getView(viewId);
  95. // Imageloader.getInstance().loadImg(view,uri);
  96. return this;
  97. }
  98.  
  99. }
  100.  

实体类Expand_DTO:

  1. package com.svp.haoyan.expandablelistview.dto;
  2.  
  3. /**
  4. * Created by haoyan on 2016/5/7.
  5. */
  6. public class Expand_DTO {
  7.  
  8. private String name;
  9. private String contents;
  10. private int pic;
  11. private int photo;
  12.  
  13. public static class Expand_child {
  14. private String childname;
  15. private String childcont;
  16.  
  17. public String getChildname() {
  18. return childname;
  19. }
  20.  
  21. public void setChildname(String childname) {
  22. this.childname = childname;
  23. }
  24.  
  25. public String getChildcont() {
  26. return childcont;
  27. }
  28.  
  29. public void setChildcont(String childcont) {
  30. this.childcont = childcont;
  31. }
  32. }
  33. public String getName() {
  34. return name;
  35. }
  36.  
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40.  
  41. public String getContents() {
  42. return contents;
  43. }
  44.  
  45. public void setContents(String contents) {
  46. this.contents = contents;
  47. }
  48.  
  49. public int getPic() {
  50. return pic;
  51. }
  52.  
  53. public void setPic(int pic) {
  54. this.pic = pic;
  55. }
  56.  
  57. public int getPhoto() {
  58. return photo;
  59. }
  60.  
  61. public void setPhoto(int photo) {
  62. this.photo = photo;
  63. }
  64.  
  65.  
  66. }

接下来是最主要的Adapter:

  1. package com.svp.haoyan.expandablelistview;
  2.  
  3. import android.content.Context;
  4. import android.database.DataSetObserver;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.ExpandableListAdapter;
  8.  
  9. import com.svp.haoyan.expandablelistview.tool.ViewHolder;
  10.  
  11. import java.util.List;
  12. import java.util.Map;
  13.  
  14. /**
  15. * Created by haoyan on 2016/4/28.
  16. */
  17. public abstract class MyExpandableListAdapter<T,F>implements ExpandableListAdapter {
  18. private Context mcontext;
  19. private List<T> mexpand_dtos;
  20. private Map<Integer, List<F>> mmap = null;
  21. public MyExpandableListAdapter(Context context, List<T> expand_dtos,Map<Integer, List<F>> map) {
  22. this.mcontext = context;
  23. this.mexpand_dtos = expand_dtos;
  24. this.mmap=map;
  25. }
  26. /*注册一个观察者(observer),当此适配器数据修改时即调用此观察者。*/
  27. @Override
  28. public void registerDataSetObserver(DataSetObserver observer) {
  29.  
  30. }
  31. /*取消先前通过registerDataSetObserver(DataSetObserver)方式注册进该适配器中的观察者对象*/
  32. @Override
  33. public void unregisterDataSetObserver(DataSetObserver observer) {
  34.  
  35. }
  36. /*获取组的个数*/
  37. @Override
  38. public int getGroupCount() {
  39. return mexpand_dtos.size();
  40. }
  41. /*返回在指定Group的Child数目。*/
  42. @Override
  43. public int getChildrenCount(int groupPosition) {
  44. return mmap.get(groupPosition).size();
  45. }
  46. //获取当前父item的数据
  47. @Override
  48. public T getGroup(int groupPosition) {
  49. return mexpand_dtos.get(groupPosition);
  50. }
  51. /*获取与在指定group给予child相关的数据。*/
  52. @Override
  53. public F getChild(int groupPosition, int childPosition) {
  54. return (mmap.get(groupPosition).get(childPosition));
  55. }
  56. /*获取指定组的ID*/
  57. @Override
  58. public long getGroupId(int groupPosition) {
  59. return groupPosition;
  60. }
  61. //得到子item的ID
  62. @Override
  63. public long getChildId(int groupPosition, int childPosition) {
  64. return childPosition;
  65. }
  66. //组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。(没效果)
  67. @Override
  68. public boolean hasStableIds() {
  69. return true;
  70. }
  71. //设置父item组件
  72. @Override
  73. public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
  74. ViewHolder viewHolder = ViewHolder.get(mcontext, convertView, parent, R.layout.expand_groupview, groupPosition,isExpanded);
  75. convert(viewHolder, getGroup(groupPosition));
  76. return viewHolder.getmConvertView();
  77. }
  78. //自己写
  79. public abstract void convert(ViewHolder viewHolder, T t);
  80.  
  81. public abstract void convertchild(ViewHolder viewHolder, F f);
  82. //设置子item的组件
  83. @Override
  84. public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
  85. ViewHolder viewHolder = ViewHolder.get(mcontext, convertView, parent, R.layout.expand_childview, groupPosition,isLastChild);
  86. convertchild(viewHolder, getChild(groupPosition,childPosition));
  87. return viewHolder.getmConvertView();
  88. /*子元素是否处于组中的最后一个(对每个组的最后一个进行操作)*/
  89. //boolean isLastChild
  90. /*下边是未封装代码,提供参考*/
  91. // String Childname = (mmap.get(groupPosition).get(childPosition)).getChildname();
  92. // LayoutInflater inflater = (LayoutInflater)mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  93. // convertView = inflater.inflate(R.layout.expand_childview, null);
  94. // TextView tv_child = (TextView) convertView.findViewById(R.id.tv_child);
  95. // tv_child.setText(Childcont);
  96. }
  97. /*是否选中指定位置上的子元素。*/
  98. @Override
  99. public boolean isChildSelectable(int groupPosition, int childPosition) {
  100. return true;
  101. }
  102. /*true所有条目可以选择和点击*/
  103. @Override
  104. public boolean areAllItemsEnabled() {
  105. return false;
  106. }
  107. /*如果当前适配器不包含任何数据则返回True。经常用来决定一个空视图是否应该被显示。
  108. 一个典型的实现将返回表达式getCount() == 0的结果,但是由于getCount()包含了头部和尾部,适配器可能需要不同的行为。*/
  109. @Override
  110. public boolean isEmpty() {
  111. return false;
  112. }
  113. /*当组展开状态的时候此方法被调用。*/
  114. @Override
  115. public void onGroupExpanded(int groupPosition) {
  116.  
  117. }
  118. /*当组收缩状态的时候此方法被调用。*/
  119. @Override
  120. public void onGroupCollapsed(int groupPosition) {
  121.  
  122. }
  123. /*根据所给的子ID号和组ID号返回唯一的ID。此外,若hasStableIds()是true,那么必须要返回稳定的ID。*/
  124. @Override
  125. public long getCombinedChildId(long groupId, long childId) {
  126. return 0;
  127. }
  128. /*同上*/
  129. @Override
  130. public long getCombinedGroupId(long groupId) {
  131. return 0;
  132. }
  133. }
  134.  

最后是调用类Activity:

  1. package com.svp.haoyan.expandablelistview;
  2.  
  3. import android.os.Bundle;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.widget.ExpandableListView;
  6.  
  7. import com.svp.haoyan.expandablelistview.dto.Expand_DTO;
  8. import com.svp.haoyan.expandablelistview.tool.ViewHolder;
  9.  
  10. import java.util.ArrayList;
  11. import java.util.HashMap;
  12. import java.util.List;
  13.  
  14. public class MainActivity extends AppCompatActivity {
  15. private ExpandableListView elistview;
  16. private List<Expand_DTO> expanddata;
  17. private HashMap<Integer, List<Expand_DTO.Expand_child>> map = null;
  18.  
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. dataView();
  24. expandView();
  25. }
  26.  
  27. private void expandView() {
  28. elistview = (ExpandableListView) findViewById(R.id.expandable_lv);
  29. elistview.setAdapter(new MyExpandableListAdapter<Expand_DTO,Expand_DTO.Expand_child>(this, expanddata,map) {
  30. @Override
  31. public void convert(ViewHolder viewHolder, Expand_DTO expand_dto) {
  32. viewHolder.setText(R.id.tv_expand, expand_dto.getName())
  33. .setText(R.id.tv_expand_two, expand_dto.getContents())
  34. .setImageResource(R.id.img_expand, expand_dto.getPic(),false)
  35. .setImageResource(R.id.img_expand_two, expand_dto.getPhoto(),false);
  36. }
  37.  
  38. @Override
  39. public void convertchild(ViewHolder viewHolder, Expand_DTO.Expand_child expand_child) {
  40. viewHolder.setText(R.id.tv_child,expand_child.getChildname())
  41. .setText(R.id.tv_child2,expand_child.getChildcont());
  42. }
  43. });
  44. //去掉自带箭头
  45. elistview.setGroupIndicator(null);
  46. }
  47.  
  48. private void dataView() {
  49. expanddata = new ArrayList<Expand_DTO>();
  50. Expand_DTO bean_zero = new Expand_DTO();
  51. bean_zero.setName("android新技能1");
  52. bean_zero.setContents("1");
  53. bean_zero.setPic(R.drawable.icon_check);
  54. bean_zero.setPhoto(R.drawable.travel_airfare_cn_position);
  55. expanddata.add(bean_zero);
  56.  
  57. Expand_DTO bean_one = new Expand_DTO();
  58. bean_one.setName("android新技能2");
  59. bean_one.setContents("2");
  60. bean_one.setPic(R.drawable.icon_check);
  61. bean_one.setPhoto(R.drawable.travel_airfare_cn_position);
  62. expanddata.add(bean_one);
  63.  
  64. Expand_DTO bean_two = new Expand_DTO();
  65. bean_two.setName("android新技能3");
  66. bean_two.setContents("3");
  67. bean_two.setPic(R.drawable.icon_check);
  68. bean_two.setPhoto(R.drawable.travel_airfare_cn_position);
  69. expanddata.add(bean_two);
  70.  
  71. //这里可以使用SparseArray优化性能
  72. map = new HashMap<Integer, List<Expand_DTO.Expand_child>>();
  73. List<Expand_DTO.Expand_child> expand_children_zero=new ArrayList<Expand_DTO.Expand_child>();
  74. Expand_DTO.Expand_child child1=new Expand_DTO.Expand_child();
  75. child1.setChildname("11111");
  76. child1.setChildcont("22222");
  77. expand_children_zero.add(child1);
  78.  
  79. Expand_DTO.Expand_child child2=new Expand_DTO.Expand_child();
  80. child2.setChildname("3333333");
  81. child2.setChildcont("4444444");
  82. expand_children_zero.add(child2);
  83. map.put(0,expand_children_zero);
  84.  
  85. List<Expand_DTO.Expand_child> expand_children_one=new ArrayList<Expand_DTO.Expand_child>();
  86. Expand_DTO.Expand_child child3=new Expand_DTO.Expand_child();
  87. child3.setChildname("55555");
  88. child3.setChildcont("66666");
  89. expand_children_one.add(child3);
  90.  
  91. Expand_DTO.Expand_child child4=new Expand_DTO.Expand_child();
  92. child4.setChildname("77777");
  93. child4.setChildcont("88888");
  94. expand_children_one.add(child4);
  95. map.put(1,expand_children_one);
  96.  
  97. List<Expand_DTO.Expand_child> children_data_two=new ArrayList<Expand_DTO.Expand_child>();
  98. Expand_DTO.Expand_child child5=new Expand_DTO.Expand_child();
  99. child5.setChildname("99999");
  100. child5.setChildcont("00000");
  101. children_data_two.add(child5);
  102.  
  103. Expand_DTO.Expand_child child6=new Expand_DTO.Expand_child();
  104. child6.setChildname("12345");
  105. child6.setChildcont("54321");
  106. children_data_two.add(child6);
  107. map.put(2,children_data_two);
  108.  
  109. }
  110. }

完活布局很简单就不贴出来了,加上图片有图有真相:

源码下载:ExpandableListView二级分栏效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号