解决方案 »

  1.   

    现在点击展开 是这样的:
    点击收起 ,又变成了原来的样子:
    写到这里都要完成了 可就是有bug.思路不清晰 也不知道怎么改;下面说说我的实现过程 望大神们指点
      

  2.   

    直接先上代码了:
    package com.example.androidx;import java.util.List;import android.content.Context;
    import android.graphics.Color;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.AbsListView.LayoutParams;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.LinearLayout;
    import android.widget.TextView;public class ExpandableAdapter extends BaseExpandableListAdapter { private LayoutInflater inflater; private List<String> group;
    private List<List<String>> child; private Context context;
    private Handler handler; //展开的GroupId
    private int expandIndex = -1;
    //关闭的GroupId
    private int collapsIndex = -1; public ExpandableAdapter(Context context, Handler handler, List<String> group, List<List<String>> child) {
    // TODO Auto-generated constructor stub
    this.group = group;
    this.child = child;
    this.context = context;
    this.handler = handler;
    this.inflater = LayoutInflater.from(context);
    } @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    final GroupHolder holder; if (convertView == null) {
    convertView = inflater.inflate(R.layout.layout_group_item, null);
    holder = new GroupHolder();
    holder.groupView = (TextView) convertView.findViewById(R.id.group_content);
    //添加一个TextView
    addGroupView(context, convertView, groupPosition);
    convertView.setTag(holder);
    } else {
    holder = (GroupHolder) convertView.getTag();
    }
    holder.groupView.setText(group.get(groupPosition));
    LinearLayout layout = (LinearLayout) convertView;
    //如果点击的的是收起 改变文字
    if (collapsIndex == groupPosition && isExpanded == false) {
    layout.getChildAt(layout.getChildCount() - 1).setVisibility(View.VISIBLE);
    }
    return convertView;
    } @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ChildHolder holder;
    if (convertView == null) {
    convertView = inflater.inflate(R.layout.layout_child_item, null);
    holder = new ChildHolder();
    holder.childView = (TextView) convertView.findViewById(R.id.child_content);
    if (isLastChild == true) {
    addChildView(context, convertView, groupPosition);
    }
    convertView.setTag(holder);
    } else {
    holder = (ChildHolder) convertView.getTag();
    }
    holder.childView.setText(child.get(groupPosition).get(childPosition));
    return convertView;
    } //展开
    @Override
    public void onGroupExpanded(int groupPosition) {
    collapsIndex = -1;
    expandIndex = groupPosition;
    System.out.println("展开展开展开");
    } //收起
    @Override
    public void onGroupCollapsed(int groupPosition) {
    expandIndex = -1;
    collapsIndex = groupPosition;
    System.out.println("关闭关闭关闭");
    } @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
    // TODO Auto-generated method stub
    return true;
    } public class GroupHolder {
    // TODO Auto-generated method stub
    TextView groupView;
    } public class ChildHolder {
    // TODO Auto-generated method stub
    TextView childView;
    } //展开回复;可能存在多个;每个convertView限加一个
    public void addGroupView(Context context, View v, final int groupIndex) {
    LinearLayout layout = (LinearLayout) v; final TextView mGroupView = new TextView(context);
    mGroupView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    mGroupView.setText("点击展开");
    mGroupView.setBackgroundResource(R.drawable.selector);
    mGroupView.setTextColor(Color.WHITE);
    mGroupView.setPadding(0, 10, 0, 10);
    mGroupView.setGravity(Gravity.CENTER);
    mGroupView.setId(M_GROUP_ID); mGroupView.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    //点击展开
    handler.sendEmptyMessage(groupIndex);
    mGroupView.setVisibility(View.GONE);
    }
    });
    for (int i = 0; i < layout.getChildCount(); i++) {
    //如果该TextView存在 则不添加
    if (layout.getChildAt(i).getId() == M_GROUP_ID) {
    return;
    }
    }
    layout.addView(mGroupView);
    } //展开回复;可能存在多个;每个convertView限加一个
    public void addChildView(Context context, View v, final int groupIndex) {
    LinearLayout layout = (LinearLayout) v; final TextView mChildView = new TextView(context);
    mChildView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    mChildView.setText("点击收起");
    mChildView.setBackgroundResource(R.drawable.selector);
    mChildView.setTextColor(Color.WHITE);
    mChildView.setPadding(0, 10, 0, 10);
    mChildView.setGravity(Gravity.CENTER);
    mChildView.setId(M_CHILD_ID); mChildView.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    //点击展开
    handler.sendEmptyMessage(groupIndex);
    mChildView.setVisibility(View.GONE);
    }
    });
    for (int i = 0; i < layout.getChildCount(); i++) {
    //如果该TextView存在 则不添加
    if (layout.getChildAt(i).getId() == M_CHILD_ID) {
    return;
    }
    }
    layout.addView(mChildView);
    } @Override
    public int getGroupCount() {
    // TODO Auto-generated method stub
    return group.size();
    } @Override
    public int getChildrenCount(int groupPosition) {
    // TODO Auto-generated method stub
    return child.get(groupPosition).size();
    } @Override
    public Object getGroup(int groupPosition) {
    // TODO Auto-generated method stub
    return group.get(groupPosition);
    } @Override
    public Object getChild(int groupPosition, int childPosition) {
    // TODO Auto-generated method stub
    return child.get(groupPosition).get(childPosition);
    } @Override
    public long getGroupId(int groupPosition) {
    // TODO Auto-generated method stub
    return groupPosition;
    } @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 false;
    } private final int M_GROUP_ID = 0x299;
    private final int M_CHILD_ID = 0x399;}
    思路简单明了;在getview 的时候添加一个TextView 再监听这个Textview;
    点击之后发送hander 去展开或者是关闭该列表实际情况是这个列表跟我想象的不一样 这样做点一下就会有bug
      

  3.   

    消息接收方:
    private Handler handler = new Handler() { @Override
    public void handleMessage(android.os.Message msg) { if (expandableListView.isGroupExpanded(msg.what)) {
    expandableListView.collapseGroup(msg.what);
    } else {
    expandableListView.expandGroup(msg.what);
    }
      

  4.   

    是什么bug,直截了当的说明白
      

  5.   

    点一下就消失了 点一下展开的又不是当前的item 跑到其他的item去了 有的点击没反应 就第点第一个一个item有效果 其实它的执行过程很难让人明白
      

  6.   

    你这里的 addGroupView和addChildView 怎么总感觉有问题啊,
    你确定你添加了个view后,原先添加的view的index不会变化?