網上找ExpandableListAdapter的資料,基本上都是那個例子,而且沒有帶自定義布局的,都是直接在代碼裡建立一個布局來添加,于是我自己實作了一個擴充卡類:
package com.example.mycccarfriend;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.CollapsibleActionView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class ExpandableListAdapter extends BaseExpandableListAdapter {
private ArrayList<HashMap<String, Object>> generalsTypes ;
//子清單個數限制了最大的清單數
private int[] generals = new int[] {
1
};
private Context context ;
private LayoutInflater inflater;
public ExpandableListAdapter(Context context,ArrayList<HashMap<String, Object>> generalsType) {
// TODO 自動生成的構造函數存根
this.context = context;
this.generalsTypes = generalsType;
this.inflater = LayoutInflater.from(context);
}
final class ViewHolder{
private TextView textView;
}
//重寫ExpandableListAdapter中的各個方法
@Override
public int getGroupCount() {
// TODO Auto-generated method stub
return generalsTypes.size();
}
@Override
public Object getGroup(int groupPosition) {
// TODO Auto-generated method stub
return generalsTypes.get(groupPosition);
}
@Override
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return groupPosition;
}
@Override
public int getChildrenCount(int groupPosition) {
// TODO Auto-generated method stub
return generals.length;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return generals[childPosition];
}
@Override
public long getChildId(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return childPosition;
}
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return true;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//if(isExpanded)expandparent = groupPosition;
ViewHolder holder;
if(convertView == null){
convertView = inflater.inflate(R.layout.item_task, null);
holder = new ViewHolder();
holder.textView = (TextView)convertView.findViewById(R.id.textView_item_task);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(generalsTypes.get(groupPosition).get("ItemText").toString());
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView == null){
convertView = inflater.inflate(R.layout.item_task_child, null);
}
ImageView telImageView = (ImageView)convertView.findViewById(R.id.imageView_item_task_child_tel);
telImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO 自動生成的方法存根
String string = generalsTypes.get(groupPosition).get("ItemText").toString();
Toast.makeText(context, "打電話"+string, Toast.LENGTH_SHORT).show();
}
});
ImageView messageImageView= (ImageView)convertView.findViewById(R.id.imageView_item_task_child_message);
messageImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO 自動生成的方法存根
Toast.makeText(context, "發短信", Toast.LENGTH_SHORT).show();
}
});
ImageView canImageView= (ImageView)convertView.findViewById(R.id.imageView_item_task_child_can);
canImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO 自動生成的方法存根
generalsTypes.remove(groupPosition);
//onGroupCollapsed(groupPosition);
((MainActivity)context).taskListView.collapseGroup(groupPosition);
notifyDataSetChanged();
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition,
int childPosition) {
// TODO Auto-generated method stub
return true;
}
}
當然重點不在這裡,重點在我的二級清單裡,橫向排布着三個imageview,其中一個長得像垃圾桶,表示删除,也就是删除該條目(注意,我一個父親隻有一個孩子清單,是以這個删除是指删除該條目的父清單),但是點選一個父清單,自動展開,再點選垃圾桶,成功删除,但是被删除的下一個清單卻展開了(我并沒有點選下一個清單),是以我想是不是因為我之前展開過被删除的清單的緣故,于是我就想調用一個函數,設定它收縮。
但是BaseExpandableListAdapter裡面沒有這個這是收縮的代碼,我繼續找,發現這個收縮的代碼在ExpandableListView裡面,于是我就把主函數裡的那個ExpandableListview傳進來,用裡面的collapseGroup(int);來設定收縮,然後就行了,請看上面的canImageView。
我也試過在外部設定:
private int position;
taskListView.setOnGroupClickListener(new OnGroupClickListener(){
@Override
public boolean onGroupClick(ExpandableListView parent, View convertView,
int groupPosition, long id) {
// TODO 自動生成的方法存根
return false;
}
});
taskListView.setOnChildClickListener(new OnChildClickListener(){
@Override
public boolean onChildClick(ExpandableListView parent, View convertView,
int groupPosition, int childPosition, long id) {
// TODO 自動生成的方法存根
Log.v("1",groupPosition+"s");
ImageView canImageView= (ImageView)convertView.findViewById(R.id.imageView_item_task_child_can);
canImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {//convertView.getTag();
// TODO 自動生成的方法存根
taskListView.collapseGroup(position);Log.v("1",position+"y");
listItem.remove(position);
expandableListAdapter.notifyDataSetChanged();
}
});
return false;
}});
但是也有一個問題,畫面第一次進去後點選垃圾桶沒反應,根據日志發現是點選了子清單,而不是子清單裡面的imageView(我絕對沒點歪),然後再點垃圾桶才能删除。
看上面代碼原來是先對子清單進行監聽,然後才能對imageView監聽,那當然第一次點選是監聽到子清單了。是以還是得用更上面的方法,在擴充卡裡調用。
另外,要設計點選一項下拉,點選另一項舊下拉項會收縮,也就是永遠隻能出現一個下拉項的話,可以這樣寫:
taskListView.setOnGroupExpandListener(new OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
for (int i = 0; i < expandableListAdapter.getGroupCount(); i++) {
if (groupPosition != i) {
taskListView.collapseGroup(i);
}
}
}
});
好了,這是我遇到的關于ExpandableListAdapter的收縮問題,困擾了我一天多,以上隻是核心思想,不能直接運作,如果有人遇到相同的問題歡迎一起來探讨。