安卓ExpandableListAdapter的二级列表监听问题--自动收缩问题

来源:互联网 发布:jsp sql 动态网页 编辑:程序博客网 时间:2024/06/06 16:50

网上找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的收缩问题,困扰了我一天多,以上只是核心思想,不能直接运行,如果有人遇到相同的问题欢迎一起来探讨。

0 0