完美实现ExpandableListView二级分栏效果

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

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

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

package com.svp.haoyan.expandablelistview.tool;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by haoyan on 2016/3/24.
 */
public class ViewHolder {
 //存储数据
 private SparseArray<View> mViews;

 private int mPosition;
 private View mConvertView;
 private boolean misExpanded;
 public ViewHolder(Context context, ViewGroup parent, int layoutId, int position,boolean isExpanded) {

  this.mPosition=position;
  this.mViews= new SparseArray<View>();
  this.misExpanded=isExpanded;
  //三
  mConvertView= LayoutInflater.from(context).inflate(layoutId,parent,false);
  //一
  mConvertView.setTag(this);
 }
 public static ViewHolder get(Context context,View convertView,
         ViewGroup parent,int layoutId,int position,boolean isExpanded){

  if (convertView==null){
   return new ViewHolder(context,parent,layoutId,position,isExpanded);
  }else {
   //五 六
   ViewHolder holder=(ViewHolder)convertView.getTag();
   holder.mPosition=position;
   return holder;
  }
 }
 //通过viewId获取控件
 //泛型T返回子类
 public <T extends View> T getView(int viewId){

  View view =mViews.get(viewId);
  if (view==null){
   //四
   view=mConvertView.findViewById(viewId);
   mViews.put(viewId,view);
  }
  return (T)view;
 }
 //八
 public View getmConvertView() {
  return mConvertView;
 }

 /**
  * 设置TextView的值
  * @param viewId
  * @param text
  * @return
  */
 //四 七 九
 public ViewHolder setText(int viewId,String text){
  TextView tv= getView(viewId);
  tv.setText(text);
  return this;
 }
 /**
  * 一参传id,二参传图片地址,三参为true则调用点击变化效果,默认为false.
  * */
 public ViewHolder setImageResource(int viewId,int resId,boolean expanded){
  ImageView view= getView(viewId);
  view.setImageResource(resId);
  if (expanded){
   if (misExpanded){
    view.setVisibility(View.GONE);
   }else {
    view.setVisibility(View.VISIBLE);
   }
  }
  return this;
 }
 public ViewHolder setImageBitamp(int viewId,Bitmap bitmap){
  ImageView view= getView(viewId);
  view.setImageBitmap(bitmap);
  return this;
 }
 public ViewHolder setImageURI(int viewId,String uri){
  ImageView view= getView(viewId);
//  Imageloader.getInstance().loadImg(view,uri);
  return this;
 }

}

实体类Expand_DTO:

package com.svp.haoyan.expandablelistview.dto;

/**
 * Created by haoyan on 2016/5/7.
 */
public class Expand_DTO {

 private String name;
 private String contents;
 private int pic;
 private int photo;

 public static class Expand_child {
  private String childname;
  private String childcont;

  public String getChildname() {
   return childname;
  }

  public void setChildname(String childname) {
   this.childname = childname;
  }

  public String getChildcont() {
   return childcont;
  }

  public void setChildcont(String childcont) {
   this.childcont = childcont;
  }
 }
 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getContents() {
  return contents;
 }

 public void setContents(String contents) {
  this.contents = contents;
 }

 public int getPic() {
  return pic;
 }

 public void setPic(int pic) {
  this.pic = pic;
 }

 public int getPhoto() {
  return photo;
 }

 public void setPhoto(int photo) {
  this.photo = photo;
 }

}

接下来是最主要的Adapter:

package com.svp.haoyan.expandablelistview;

import android.content.Context;
import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListAdapter;

import com.svp.haoyan.expandablelistview.tool.ViewHolder;

import java.util.List;
import java.util.Map;

/**
 * Created by haoyan on 2016/4/28.
 */
public abstract class MyExpandableListAdapter<T,F>implements ExpandableListAdapter {
 private Context mcontext;
 private List<T> mexpand_dtos;
 private Map<Integer, List<F>> mmap = null;
 public MyExpandableListAdapter(Context context, List<T> expand_dtos,Map<Integer, List<F>> map) {
  this.mcontext = context;
  this.mexpand_dtos = expand_dtos;
  this.mmap=map;
 }
 /*注册一个观察者(observer),当此适配器数据修改时即调用此观察者。*/
 @Override
 public void registerDataSetObserver(DataSetObserver observer) {

 }
 /*取消先前通过registerDataSetObserver(DataSetObserver)方式注册进该适配器中的观察者对象*/
 @Override
 public void unregisterDataSetObserver(DataSetObserver observer) {

 }
 /*获取组的个数*/
 @Override
 public int getGroupCount() {
  return mexpand_dtos.size();
 }
 /*返回在指定Group的Child数目。*/
 @Override
 public int getChildrenCount(int groupPosition) {
  return mmap.get(groupPosition).size();
 }
 //获取当前父item的数据
 @Override
 public T getGroup(int groupPosition) {
  return mexpand_dtos.get(groupPosition);
 }
 /*获取与在指定group给予child相关的数据。*/
 @Override
 public F getChild(int groupPosition, int childPosition) {
  return (mmap.get(groupPosition).get(childPosition));
 }
 /*获取指定组的ID*/
 @Override
 public long getGroupId(int groupPosition) {
  return groupPosition;
 }
 //得到子item的ID
 @Override
 public long getChildId(int groupPosition, int childPosition) {
  return childPosition;
 }
 //组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。(没效果)
 @Override
 public boolean hasStableIds() {
  return true;
 }
 //设置父item组件
 @Override
 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
  ViewHolder viewHolder = ViewHolder.get(mcontext, convertView, parent, R.layout.expand_groupview, groupPosition,isExpanded);
  convert(viewHolder, getGroup(groupPosition));
  return viewHolder.getmConvertView();
 }
 //自己写
 public abstract void convert(ViewHolder viewHolder, T t);

 public abstract void convertchild(ViewHolder viewHolder, F f);
 //设置子item的组件
 @Override
 public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
  ViewHolder viewHolder = ViewHolder.get(mcontext, convertView, parent, R.layout.expand_childview, groupPosition,isLastChild);
  convertchild(viewHolder, getChild(groupPosition,childPosition));
  return viewHolder.getmConvertView();
  /*子元素是否处于组中的最后一个(对每个组的最后一个进行操作)*/
  //boolean isLastChild
  /*下边是未封装代码,提供参考*/
//  String Childname = (mmap.get(groupPosition).get(childPosition)).getChildname();
//  LayoutInflater inflater = (LayoutInflater)mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//  convertView = inflater.inflate(R.layout.expand_childview, null);
//  TextView tv_child = (TextView) convertView.findViewById(R.id.tv_child);
//  tv_child.setText(Childcont);
 }
 /*是否选中指定位置上的子元素。*/
 @Override
 public boolean isChildSelectable(int groupPosition, int childPosition) {
  return true;
 }
 /*true所有条目可以选择和点击*/
 @Override
 public boolean areAllItemsEnabled() {
  return false;
 }
 /*如果当前适配器不包含任何数据则返回True。经常用来决定一个空视图是否应该被显示。
 一个典型的实现将返回表达式getCount() == 0的结果,但是由于getCount()包含了头部和尾部,适配器可能需要不同的行为。*/
 @Override
 public boolean isEmpty() {
  return false;
 }
 /*当组展开状态的时候此方法被调用。*/
 @Override
 public void onGroupExpanded(int groupPosition) {

 }
 /*当组收缩状态的时候此方法被调用。*/
 @Override
 public void onGroupCollapsed(int groupPosition) {

 }
 /*根据所给的子ID号和组ID号返回唯一的ID。此外,若hasStableIds()是true,那么必须要返回稳定的ID。*/
 @Override
 public long getCombinedChildId(long groupId, long childId) {
  return 0;
 }
 /*同上*/
 @Override
 public long getCombinedGroupId(long groupId) {
  return 0;
 }
}

最后是调用类Activity:

package com.svp.haoyan.expandablelistview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ExpandableListView;

import com.svp.haoyan.expandablelistview.dto.Expand_DTO;
import com.svp.haoyan.expandablelistview.tool.ViewHolder;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MainActivity extends AppCompatActivity {
 private ExpandableListView elistview;
 private List<Expand_DTO> expanddata;
 private HashMap<Integer, List<Expand_DTO.Expand_child>> map = null;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  dataView();
  expandView();
 }

 private void expandView() {
  elistview = (ExpandableListView) findViewById(R.id.expandable_lv);
  elistview.setAdapter(new MyExpandableListAdapter<Expand_DTO,Expand_DTO.Expand_child>(this, expanddata,map) {
   @Override
   public void convert(ViewHolder viewHolder, Expand_DTO expand_dto) {
    viewHolder.setText(R.id.tv_expand, expand_dto.getName())
      .setText(R.id.tv_expand_two, expand_dto.getContents())
      .setImageResource(R.id.img_expand, expand_dto.getPic(),false)
      .setImageResource(R.id.img_expand_two, expand_dto.getPhoto(),false);
   }

   @Override
   public void convertchild(ViewHolder viewHolder, Expand_DTO.Expand_child expand_child) {
    viewHolder.setText(R.id.tv_child,expand_child.getChildname())
       .setText(R.id.tv_child2,expand_child.getChildcont());
   }
  });
  //去掉自带箭头
  elistview.setGroupIndicator(null);
 }

 private void dataView() {
  expanddata = new ArrayList<Expand_DTO>();
  Expand_DTO bean_zero = new Expand_DTO();
  bean_zero.setName("android新技能1");
  bean_zero.setContents("1");
  bean_zero.setPic(R.drawable.icon_check);
  bean_zero.setPhoto(R.drawable.travel_airfare_cn_position);
  expanddata.add(bean_zero);

  Expand_DTO bean_one = new Expand_DTO();
  bean_one.setName("android新技能2");
  bean_one.setContents("2");
  bean_one.setPic(R.drawable.icon_check);
  bean_one.setPhoto(R.drawable.travel_airfare_cn_position);
  expanddata.add(bean_one);

  Expand_DTO bean_two = new Expand_DTO();
  bean_two.setName("android新技能3");
  bean_two.setContents("3");
  bean_two.setPic(R.drawable.icon_check);
  bean_two.setPhoto(R.drawable.travel_airfare_cn_position);
  expanddata.add(bean_two);

  //这里可以使用SparseArray优化性能
  map = new HashMap<Integer, List<Expand_DTO.Expand_child>>();
  List<Expand_DTO.Expand_child> expand_children_zero=new ArrayList<Expand_DTO.Expand_child>();
  Expand_DTO.Expand_child child1=new Expand_DTO.Expand_child();
  child1.setChildname("11111");
  child1.setChildcont("22222");
  expand_children_zero.add(child1);

  Expand_DTO.Expand_child child2=new Expand_DTO.Expand_child();
  child2.setChildname("3333333");
  child2.setChildcont("4444444");
  expand_children_zero.add(child2);
  map.put(0,expand_children_zero);

  List<Expand_DTO.Expand_child> expand_children_one=new ArrayList<Expand_DTO.Expand_child>();
  Expand_DTO.Expand_child child3=new Expand_DTO.Expand_child();
  child3.setChildname("55555");
  child3.setChildcont("66666");
  expand_children_one.add(child3);

  Expand_DTO.Expand_child child4=new Expand_DTO.Expand_child();
  child4.setChildname("77777");
  child4.setChildcont("88888");
  expand_children_one.add(child4);
  map.put(1,expand_children_one);

  List<Expand_DTO.Expand_child> children_data_two=new ArrayList<Expand_DTO.Expand_child>();
  Expand_DTO.Expand_child child5=new Expand_DTO.Expand_child();
  child5.setChildname("99999");
  child5.setChildcont("00000");
  children_data_two.add(child5);

  Expand_DTO.Expand_child child6=new Expand_DTO.Expand_child();
  child6.setChildname("12345");
  child6.setChildcont("54321");
  children_data_two.add(child6);
  map.put(2,children_data_two);

 }
}

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

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

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

(0)

相关推荐

  • ExpandableListView实现二级列表购物车

    android中常常要用到ListView,有时也要用到ExpandableListView,如在手机设置中,对于分类有很好的效果,会用ListView的人一定会用ExpandableListView,因为ExpandableListView extends ListView的,下面来看个简单的例子 运行效果图: 导入依赖 compile 'com.google.code.gson:gson:2.8.2' compile 'com.squareup.okhttp3:okhttp:3.9.0' 记

  • ExpandableListView实现简单二级列表

    本文实例为大家分享了ExpandableListView实现简单二级列表的具体代码,供大家参考,具体内容如下 xml创建一个 ExpandableListView <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="m

  • 完美实现ExpandableListView二级分栏效果

    本文实例为大家分享了ExpandableListView二级分栏效果的具体代码,供大家参考,具体内容如下 对ExpandableListView控件进行封装(未自定义)直接上代码: 通用ViewHolder类,仅在setImageResource中添加代码 package com.svp.haoyan.expandablelistview.tool; import android.content.Context; import android.graphics.Bitmap; import an

  • Bootstrap实现默认导航栏效果

    导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点.导航栏是响应式元组件就,作为应用程序或网站的导航标题.导航栏在移动设备的视图中是折叠的,随着可用视口宽度的增加,导航栏也会水平展开.在 Bootstrap 导航栏的核心中,导航栏包括了为站点名称和基本的导航定义样式. 创建一个默认的导航栏的步骤如下: 向 <nav> 标签添加 class .navbar..navbar-default(白底黑字),navbar-inverse(黑底白字) 向上面的元素添加 role="

  • Android5.0多种侧滑栏效果实例代码

    1.普通侧滑 效果图: 思路:通过自定义View继承HorizontalScrollView,然后重写onMeasure(),onLayout(),onTouchEvent() 方法并设置menu(通过动画使menu开始时处于隐藏状态)布局和content布局.(注意:使用ViewHelper类需要导入nineoldandroids-2.4.0.jar包) menu(left_menu)布局代码: <?xml version="1.0" encoding="utf-8&

  • Java如何实现Word文档分栏效果

    分栏是报刊.书籍.杂志常用的排版样式,它不仅能方便阅读,同时也能增加页面的美观度.本文将介绍如何在Java应用程序中给Word文档添加多个栏来实现分栏效果,以及如何设置每栏的宽度.间距和分割线. 使用工具:Free Spire.Doc for Java(免费版) Jar文件导入方法 方法一: 下载Free Spire.Doc for Java包并解压缩,然后从lib文件夹下,将Spire.Doc.jar包导入到你的Java应用程序中.(导入成功后如下图所示) Java 实现 Word 文档分栏效

  • jQuery实现的粘性滚动导航栏效果实例【附源码下载】

    本文实例讲述了jQuery实现的粘性滚动导航栏效果.分享给大家供大家参考,具体如下: 粘性滚动是当导航在滚动过程中会占粘于浏览器上,达到方便网站页面浏览的效果,也是一种用户体验,下面我们看一下是怎么实现的: jQuery的 smint插件,也是一个导航菜单固定插件.当页滚动时,导航菜单会固定在顶部:当点击菜单时,页面会平滑的滚动到对应的区域. 兼容性 由于 smint 使用了 position: fixed,所以它不兼容 IE6.适用浏览器:IE8.360.FireFox.Chrome.Safa

  • 基于javascript制作微博发布栏效果

    本文为大家分享了做微博发布栏效果的过程,涉及到的知识点包括以下: 1.判断IE的方法:直接用  var ie=!-[1,];即可 2.连续发生事件的用法:  IE下:触发对象.onpropertychange  标准下:触发对象.oninput 3.焦点聚集和移开事件.onfocus和onblur 4.判断单字节(0-255之间)与双子节:正则表达式:/[^\x00-\xff]/g 代码如上: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra

  • JavaScript实现滚动栏效果的方法

    本文实例讲述了JavaScript实现滚动栏效果的方法.分享给大家供大家参考.具体如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> * { margin: 0; padding: 0; } #div1 ul{ position: absolute; le

  • jquery实现鼠标点击后展开列表内容的导航栏效果

    本文实例讲述了jquery实现鼠标点击后展开列表内容的导航栏效果.分享给大家供大家参考.具体如下: 这是一款基于jQuery实现的导航栏,鼠标点击后展开隐藏的列表内容,用来制作一个目录是最合适不过的选择.本例是锋利的jQeury中的一个实例,这是最终的优化版本,兼容性还示曾测试,在火狐的表现尚不知情,有兴趣的朋友可测试或修正. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-mouse-click-show-table-nav-co

  • jQuery实现表格冻结顶栏效果

    昨天晚上公司遇到个小需求,就是实现类似表格冻结顶栏的效果,具体描述就是下面动态图的效果 这样的效果不算是很难,但是实现起来确实挺麻烦的,这里的难点就不多说了,就是这个效果一下子弄到一点多,最后在我经常逛的一个网站里找到了答案. 原问题的地址:https://segmentfault.com/q/1010000000130774 这里介绍一下这个小插件的用法.首先先去著名'同性'交往网站github里把代码下载下来.解压后是这样的: 主要用到是我红色框框里的,也可以看人家的源代码.这里只需要引用j

  • JavaScript实现滑动导航栏效果

    本文实例为大家分享了js实现滑动导航栏效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1.

随机推荐