Android 之ExpandableListView使用

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

感谢原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值