关于使用ExpandListView自定义展开关闭的问题

xiaoming96x 2014-07-22 03:18:56
楼主是在是要抓狂了 ...
先上图 怕楼主解释不清楚..

这是一个未展开的ExpandListview 红色的按钮时我加上去的;
...全文
1237 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_22605167 2015-07-22
  • 打赏
  • 举报
回复
楼主,我看啦一下感觉很多地方都要用到,源码给我试试,1148604824@qq.com 本人 菜鸟一枚
sagittarius1988 2014-07-22
  • 打赏
  • 举报
回复
你这里的 addGroupView和addChildView 怎么总感觉有问题啊, 你确定你添加了个view后,原先添加的view的index不会变化?
xiaoming96x 2014-07-22
  • 打赏
  • 举报
回复
点一下就消失了 点一下展开的又不是当前的item 跑到其他的item去了 有的点击没反应 就第点第一个一个item有效果 其实它的执行过程很难让人明白
sagittarius1988 2014-07-22
  • 打赏
  • 举报
回复
是什么bug,直截了当的说明白
xiaoming96x 2014-07-22
  • 打赏
  • 举报
回复
消息接收方:
	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);
			}
xiaoming96x 2014-07-22
  • 打赏
  • 举报
回复
直接先上代码了:
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
xiaoming96x 2014-07-22
  • 打赏
  • 举报
回复
现在点击展开 是这样的: 点击收起 ,又变成了原来的样子: 写到这里都要完成了 可就是有bug.思路不清晰 也不知道怎么改; 下面说说我的实现过程 望大神们指点

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧