关于使用ExpandListView自定义展开关闭的问题 expandlistview 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 现在点击展开 是这样的:点击收起 ,又变成了原来的样子:写到这里都要完成了 可就是有bug.思路不清晰 也不知道怎么改;下面说说我的实现过程 望大神们指点 直接先上代码了: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 消息接收方: 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); } 是什么bug,直截了当的说明白 点一下就消失了 点一下展开的又不是当前的item 跑到其他的item去了 有的点击没反应 就第点第一个一个item有效果 其实它的执行过程很难让人明白 你这里的 addGroupView和addChildView 怎么总感觉有问题啊,你确定你添加了个view后,原先添加的view的index不会变化? 安卓平板 串口通信 OTG 蓝牙 android怎么把一个view放入xml中 求解,怎样改,R.id老是出错 我想在HTC G3上安装个google语音搜索,怎么在安卓市场上找不到呢? 返回数据如何处理—————————————标题要长 androiod 实现js调用扫描二维码的问题 冰天雪地裸替跪求 android添加系统级库 为什么我创建的安卓程序没有actionbar? alertdialog AOSP开发项目组织架构 android自绘图形和图片哪个性能好 新人求助,android slidingmenu
点击收起 ,又变成了原来的样子:
写到这里都要完成了 可就是有bug.思路不清晰 也不知道怎么改;下面说说我的实现过程 望大神们指点
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
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);
}
你确定你添加了个view后,原先添加的view的index不会变化?