软件编程
位置:首页>> 软件编程>> Android编程>> 完美实现ExpandableListView二级分栏效果

完美实现ExpandableListView二级分栏效果

作者:帝乙岩  发布时间:2021-07-18 20:04:13 

标签: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二级分栏效果

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

来源:https://blog.csdn.net/Emperor_rock/article/details/51366938

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com