天天看點

安卓ExpandableListAdapter的二級清單監聽問題--自動收縮問題

網上找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的收縮問題,困擾了我一天多,以上隻是核心思想,不能直接運作,如果有人遇到相同的問題歡迎一起來探讨。