完美实现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二级分栏效果 的全部内容, 来源链接: utcz.com/p/241336.html

回到顶部