ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。
重要方法:
1
2
3
4
5
6
7
8
9
10
11
12
|
expandGroup (
int
groupPos) ;
//在分组列表视图中 展开一组,
setSelectedGroup (
int
groupPosition) ;
//设置选择指定的组。
setSelectedChild (
int
groupPosition,
int
childPosition,
boolean
shouldExpandGroup);
//设置选择指定的子项。
getPackedPositionGroup (
long
packedPosition);
//返回所选择的组
getPackedPositionForChild (
int
groupPosition,
int
childPosition) ;
//返回所选择的子项
getPackedPositionType (
long
packedPosition);
//返回所选择项的类型(Child,Group)
isGroupExpanded (
int
groupPosition);
//判断此组是否展开
|
expandableListView.setDivider();这个是设定每个Group之间的分割线。
expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。
expandableListView.collapseGroup(int group); 将第group组收起
ExpandableListAdapter
一个接口,将基础数据链接到一个ExpandableListView。 此接口的实施将提供访问Child的数据(由组分类),并实例化的Child和Group。
1.重要方法
getChildId (int groupPosition, int childPosition) 获取与在给定组给予孩子相关的数据。
getChildrenCount (int groupPosition) 返回在指定Group的Child数目。
2,适配器介绍:
package com.example.administrator.myapplication.adapter;
import android.graphics.Paint;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.List;
import java.util.Map;
import com.example.administrator.myapplication.PrentChildActivity;
import com.example.administrator.myapplication.R;
import com.example.administrator.myapplication.bean.ProtectBean;
import com.example.administrator.myapplication.bean.prentChildBean;
import com.example.administrator.myapplication.utils.BitmapUtil;
import com.lidroid.xutils.BitmapUtils;
import org.w3c.dom.Text;
/**
* 身边服务显示数据的适配器接口
*/
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
private List<prentChildBean> groupArray;//组数据
// private Map<String,ProtectBean> childArray;//子数据
private List<List<ProtectBean>> childArray;
private PrentChildActivity act;
private ExpandableListView expandableListView;
private BitmapUtils bitmapUtils;
private TextView tvFram;
public MyExpandableListAdapter(List<prentChildBean> groupArray, List<List<ProtectBean>> childArray, PrentChildActivity act,ExpandableListView expandableListView) {<span style="white-space:pre"> </span>//从activity中传入数据要将组数据和子类数据一起通过适配器传入
this.groupArray = groupArray;
this.childArray = childArray;
this.act = act;
this.expandableListView = expandableListView;
}
@Override
public int getGroupCount() {
return groupArray.size();//返回组的长度
}
@Override
public int getChildrenCount(int groupPosition) {
/* if (childArray.get(groupPosition).size()>2) {//加上这句话的意思是子数据只显示两条信息,并且剩余一条可以实现加载更多
return 3;
}*/
return childArray.get(groupPosition).size();//返回每一个组控件内,子控件的长度。
}
@Override
public Object getGroup(int groupPosition) {
return getGroup(groupPosition);//返回本方法。死的。
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return childArray.get(groupPosition).get(childPosition);//返回子控件对应组控件的item
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;//组控件的数字
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;//子控件的数字
}
@Override
public boolean hasStableIds() {
return false;
}
/**
* 这里是组控件的方法
* @param groupPosition 组位置(决定返回哪个视图)
* @param isExpanded 该组是展开状态还是伸缩状态
* @param convertView 重用已有的视图对象
* @param parent 子元素是否处于组中的最后一个
* @return
*/
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = act.getLayoutInflater().inflate(R.layout.item_act_prentchild_listview,null);
}
ImageView ivLogo = (ImageView)ViewHolder.get(convertView,R.id.item_act_prentchild_listview_iv);
TextView tvName = (TextView)ViewHolder.get(convertView,R.id.item_act_prentchild_listview_name);
TextView tvName02 = (TextView)ViewHolder.get(convertView,R.id.item_act_prentchild_listview_name02);
TextView tvName03 = (TextView)ViewHolder.get(convertView,R.id.item_act_prentchild_listview_name03);
RatingBar rb = (RatingBar)ViewHolder.get(convertView,R.id.item_act_praentchild_listview_ratingbar);
TextView tvLoaction = (TextView)ViewHolder.get(convertView,R.id.item_act_prentchild_listview_location);
TextView tvLoactionNum = (TextView)ViewHolder.get(convertView,R.id.item_act_prentchild_listview_location_num);
//加载店铺图片
bitmapUtils = new BitmapUtils(act);
bitmapUtils.display(ivLogo, groupArray.get(groupPosition).getShop_logo());
tvName.setText(groupArray.get(groupPosition).getShop_name());
tvName02.setText(groupArray.get(groupPosition).getShop_desc());
tvName03.setText(groupArray.get(groupPosition).getType_name());
tvLoaction.setText(groupArray.get(groupPosition).getArea());
tvLoactionNum.setText(groupArray.get(groupPosition).getDistance()+"km");
float rbfloat = Float.parseFloat(groupArray.get(groupPosition).getService());
if (rbfloat<=0){
rb.setRating(5.0f);
}else{
rb.setRating(rbfloat);
}
//设置不展开后不可以合并.设置这个意思是组控件点击不会收回子控件
//convertView.setClickable(true);
return convertView;
}
/**
* 这里是子控件的方法
* @param groupPosition 组位置(该组内部含有子元素)
* @param childPosition 子元素位置(决定返回哪个视图
* @param isLastChild 子元素是否处于组中的最后一个
* @param convertView 重用已有的视图(View)对象
* @param parent 返回的视图对象始终依附于的视图组
* @return
*/
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null){
convertView = act.getLayoutInflater().inflate(R.layout.item_act_child_listview,null);
}
TextView money = (TextView)ViewHolder.get(convertView,R.id.item_act_child_listview_money);
TextView aflte = (TextView)ViewHolder.get(convertView,R.id.item_act_child_listview_money_after);
TextView pieces = (TextView)ViewHolder.get(convertView,R.id.item_act_child_listview_pieces);
TextView originalMoney = (TextView)ViewHolder.get(convertView,R.id.item_act_child_listview_originalMoney);
tvFram = (TextView)ViewHolder.get(convertView,R.id.act_parentchild_framtv);
RelativeLayout rl = (RelativeLayout)ViewHolder.get(convertView,R.id.act_parentchild_rlfram);
if (childPosition < 2) {
money.setText(childArray.get(groupPosition).get(childPosition).getVip_price());
aflte.setText(childArray.get(groupPosition).get(childPosition).getProduct_name());
pieces.setText("已售:"+childArray.get(groupPosition).get(childPosition).getSale_num());
originalMoney.setText(childArray.get(groupPosition).get(childPosition).getMarket_price());
originalMoney.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//设置横线为中
}
if (childPosition==3){
money.setText(childArray.get(groupPosition).get(childPosition).getVip_price());
aflte.setText(childArray.get(groupPosition).get(childPosition).getProduct_name());
pieces.setText("已售:"+childArray.get(groupPosition).get(childPosition).getSale_num());
originalMoney.setText(childArray.get(groupPosition).get(childPosition).getMarket_price());
originalMoney.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//设置横线为中
//设置显示
rl.setVisibility(View.INVISIBLE);
tvFram.setVisibility(View.VISIBLE);
}
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {//如果让子条目响应click事件,必须返回true
return true;
}
/*
@Override
public void notifyDataSetChanged() {
int groupCount = expandableListView.getCount();
Log.i("zzz", "groupCount="+groupCount);
super.notifyDataSetChanged();
for (int i = 0; i < groupCount; i++) {
expandableListView.expandGroup(i);
}
}*/
}
3.如果让组控件不可以被点击,在getGroupView方法中设置
//convertView.setClickable(true);
4.如果让子控件返回的数据不显示全部在,除了在getChildView方法中判断显示数据外,还要在getChildrenCount方法中判断返回的item数
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null){
convertView = act.getLayoutInflater().inflate(R.layout.item_act_child_listview,null);
}
//特价
TextView money = (TextView)ViewHolder.get(convertView,R.id.item_act_child_listview_money);
//商品名
TextView aflte = (TextView)ViewHolder.get(convertView,R.id.item_act_child_listview_money_after);
//已售的件数。拼接
TextView pieces = (TextView)ViewHolder.get(convertView,R.id.item_act_child_listview_pieces);
//原价
TextView originalMoney = (TextView)ViewHolder.get(convertView,R.id.item_act_child_listview_originalMoney);
//重叠
tvFram = (TextView)ViewHolder.get(convertView,R.id.act_parentchild_framtv);
RelativeLayout rl = (RelativeLayout)ViewHolder.get(convertView,R.id.act_parentchild_rlfram);
if (childPosition < 2) {
money.setText(childArray.get(groupPosition).get(childPosition).getVip_price());
aflte.setText(childArray.get(groupPosition).get(childPosition).getProduct_name());
pieces.setText("已售:"+childArray.get(groupPosition).get(childPosition).getSale_num());
originalMoney.setText(childArray.get(groupPosition).get(childPosition).getMarket_price());
originalMoney.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//设置横线为中
}
if (childPosition==3){
money.setText(childArray.get(groupPosition).get(childPosition).getVip_price());
aflte.setText(childArray.get(groupPosition).get(childPosition).getProduct_name());
pieces.setText("已售:"+childArray.get(groupPosition).get(childPosition).getSale_num());
originalMoney.setText(childArray.get(groupPosition).get(childPosition).getMarket_price());
originalMoney.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//设置横线为中
//设置显示
rl.setVisibility(View.INVISIBLE);
tvFram.setVisibility(View.VISIBLE);
}
return convertView;
}
public int getChildrenCount(int groupPosition) {
if (childArray.get(groupPosition).size()>2) {
return 3;//可以多出一个条目设置加载更多
}
return childArray.get(groupPosition).size();//返回每一个组控件内,子控件的长度
}
5.设置默认显示,不用点击
MyExpandableListAdapter myExpandable = new MyExpandableListAdapter(groupArray, addChildArray, PrentChildActivity.this,expandableListView);
expandableListView.setAdapter(myExpandable);
//设置默认展开
int pos = expandableListView.getCount();
for (int i = 0; i <pos-1 ; i++) {
expandableListView.expandGroup(i);
}
6.设置去掉或者更换图标
expandableListView.setGroupIndicator(null);
参考:http://my.oschina.net/amigos/blog/62614
感谢原作者