Android ExpandableListView的使用

(文中說的一級標籤二級標籤也就是所謂的父級和子級) 在Android開發中會遇到點擊時彈出二級標籤的效果,能夠使用Android自帶的ExpandableListView,其用法跟Listview相似,不一樣點在於其使用的Adapter中須要重寫的內容比較多。其中Adapter分爲BaseExpandableListAdapter和ExpandableListAdapter,BaseExpandableListAdapter擴展了ExpandableListAdapter,使用起來也更加方便,能夠刷新adapter,判斷一級標籤總數大小是否爲0. 其中繼承自ExpandableListAdapter的寫法以下:java

package com.okkuaixiu.combo.adapter;

import android.content.Context;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListAdapter;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.ArrayList;

public class MyExpandListAdapter implements ExpandableListAdapter{

    private ArrayList<AddQuotationBean.ASQuotations> list_quotation;//一級標籤的數據源
    private ArrayList<ArrayList<AddQuotationBean.QDetails>> listsQDetail;//二級標籤
    private Context context;

    public MyExpandListAdapter(ArrayList<AddQuotationBean.ASQuotations> list_quotation, Context context) {
        this.list_quotation = list_quotation;
        this.context = context;
        //爲二級標籤添加數據
        if (list_quotation != null && list_quotation.size() > 0) {
            listsQDetail = new ArrayList<>();
            for (AddQuotationBean.ASQuotations asquotations:
                    list_quotation) {
                listsQDetail.add(asquotations.QDetails);
            }
        }
    }

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {

    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {

    }

    //獲取一級標籤總數
    @Override
    public int getGroupCount() {
        return list_quotation.size();
    }

    //獲取二級標籤總數
    @Override
    public int getChildrenCount(int groupPosition) {
        return listsQDetail.size();
    }

    //獲取一級標籤內容
    @Override
    public Object getGroup(int groupPosition) {
        return list_quotation.get(groupPosition);
    }

    //獲取二級標籤內容
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return listsQDetail.get(groupPosition).get(childPosition);
    }

    //獲取一級標籤的ID
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    //獲取二級標籤的ID
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    //指定位置相應的組視圖
    @Override
    public boolean hasStableIds() {
        return true;
    }

    //對一級標籤進行設置
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        // 爲視圖對象指定佈局
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_price_menu_detail, null);
            viewHolder = new ViewHolder();
            viewHolder.tv_space_name = (TextView) convertView.findViewById(R.id.price_detail_space_name);
            viewHolder.tv_diff_sum = (TextView) convertView.findViewById(R.id.price_detail_diff);
            viewHolder.item_price_linelayout = (View) convertView.findViewById(R.id.item_price_linelayout);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        AddQuotationBean.ASQuotations asQuotations = list_quotation.get(groupPosition);
        viewHolder.tv_space_name.setText(asQuotations.SpaceName);
        viewHolder.tv_diff_sum.setText("¥" + Util.getNonScientificCount(asQuotations.SpaceTotalMoney + "", true));
        //二級標籤是否展開
        if (isExpanded) {
            viewHolder.item_price_linelayout.setVisibility(View.GONE);
        } else {
            viewHolder.item_price_linelayout.setVisibility(View.VISIBLE);
        }

        return convertView;
    }

    //一級標籤對應的內部類
    private class ViewHolder{
        private TextView tv_space_name;// 空間名
        private TextView tv_diff_sum;// 差價小計
        private View item_price_linelayout;//底部分割佈局
        private LinearLayout ll_info;// 材料信息
        private RelativeLayout price_detail_layout;//空間名和差價小計總體的佈局
    }
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        try {
            ChildViewHolder childViewHolder = null;
            if (convertView == null) {
                childViewHolder = new ChildViewHolder();
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.item_price_menu_detail_info, null);
                childViewHolder.detail_construct_name = (TextView) convertView.findViewById(R.id.info_construct_name);//施工項目
                childViewHolder.detail_material_name = (TextView) convertView.findViewById(R.id.info_material_name);//材料名稱
                childViewHolder.detail_material_brand = (TextView) convertView.findViewById(R.id.info_brand);//材料品牌
                childViewHolder.detail_material_model = (TextView) convertView.findViewById(R.id.info_model);//材料型號
                childViewHolder.detail_diff = (TextView) convertView.findViewById(R.id.info_price_diff);//單位差價
                childViewHolder.detail_count = (TextView) convertView.findViewById(R.id.info_count);//數量
                childViewHolder.item_price_info_linelayout = (View) convertView.findViewById(R.id.item_price_info_linelayout);// 底部間隔佈局
                convertView.setTag(childViewHolder);
            } else {
                childViewHolder = (ChildViewHolder) convertView.getTag();
            }
            //當二級標籤的內容展開時再顯示間隔佈局
            if (isLastChild) {
                childViewHolder.item_price_info_linelayout.setVisibility(View.VISIBLE);
            } else {
                childViewHolder.item_price_info_linelayout.setVisibility(View.GONE);
            }
            AddQuotationBean.QDetails qDetails = listsQDetail.get(groupPosition).get(childPosition);
            childViewHolder.detail_construct_name.setText(qDetails.ConstructionName);
            childViewHolder.detail_material_name.setText(qDetails.MateralName);
            childViewHolder.detail_material_brand.setText(qDetails.BrandName);
            childViewHolder.detail_material_model.setText(qDetails.MateralCode);
            childViewHolder.detail_diff.setText("¥" + Util.getNonScientificCount(qDetails.Difference + "", true));
            childViewHolder.detail_count.setText(qDetails.DMNumber + (!Util.isTextNull(qDetails.Unit) ? qDetails.Unit : ""));
        } catch (Exception e) {
            LogUtil.e(getClass(), "getChildView", e);
        }
        return convertView;
    }
    //二級標籤對應的內部類
    private class ChildViewHolder{
        private TextView detail_construct_name;// 施工項目
        private TextView detail_material_name;//材料名稱
        private TextView detail_material_brand;//材料品牌
        private TextView detail_material_model;//材料型號
        private TextView detail_diff;//單位差價
        private TextView detail_count;//數量
        private View item_price_info_linelayout;// 底部間隔佈局
    }

    //子列表項是否可否觸發事件,返回true則爲能夠響應點擊 
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public void onGroupExpanded(int groupPosition) {

    }

    @Override
    public void onGroupCollapsed(int groupPosition) {

    }

    @Override
    public long getCombinedChildId(long groupId, long childId) {
        return 0;
    }

    @Override
    public long getCombinedGroupId(long groupId) {
        return 0;
    }
}

代碼註釋如上。 針對ExpandableListView的屬性有一些要說明的地方有:android:groupIndicator="@null"表示去掉默認的圖標箭頭。若是設置了android:divider,那麼其一級標籤和二級標籤中都會出現android

相關文章
相關標籤/搜索