(文中說的一級標籤二級標籤也就是所謂的父級和子級) 在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