Android:自定义可扩展列表和复选框问题。为什么支票箱状态是随机的?
问题是: 为什么会这样?? 若我选中“媒体”附近的复选框并展开节点,复选标记将转到第二个子节点。 我不明白为什么 EDIT1:已解决复选框状态。另一个问题发生了 但是,也许我刚刚明白问题不在状态!!!问题是切换的行的位置!如果我在刚加载视图时放置了一个数组进行检查,那么复选框状态工作得很好!问题是视图位置!情况就是这样:Android:自定义可扩展列表和复选框问题。为什么支票箱状态是随机的?,android,checkbox,expandablelistview,baseadapter,Android,Checkbox,Expandablelistview,Baseadapter,问题是: 为什么会这样?? 若我选中“媒体”附近的复选框并展开节点,复选标记将转到第二个子节点。 我不明白为什么 EDIT1:已解决复选框状态。另一个问题发生了 但是,也许我刚刚明白问题不在状态!!!问题是切换的行的位置!如果我在刚加载视图时放置了一个数组进行检查,那么复选框状态工作得很好!问题是视图位置!情况就是这样: row0: parentA + checkBoxMARKED row1: parentB + checkBoxNOTmarked 点击一个按钮,这应该会发生: row0:
row0: parentA + checkBoxMARKED
row1: parentB + checkBoxNOTmarked
点击一个按钮,这应该会发生:
row0: parentA + checkBoxMARKED
subRow0: --childA
row1: parentB + checkBoxNOTmarked
但是,恰恰相反,这会发生(父开关)
现在,如果我评论这句话
if(usedPositionParent.contains(convertView.getId())){
return convertView;
}
else{
usedPositionParent.add(convertView.getId());
}
情况变得:
row0: parentA + checkBoxMARKED
row1: parentB + checkBoxNOTmarked
单击,出现以下情况:
row1: parentA + checkBoxNOTmarked
subRow1: --childA
row0: parentB + checkBoxMARKED
但实际上,parentA是第0行!!!因此,这似乎不是一个复选框问题。这是家长职位的问题!!你在想什么
这是新代码:
public class ListaEspandibileAdapter extends BaseExpandableListAdapter {
private ArrayList<Object> _objInt;
Context mContext;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//HashMap<Integer,Boolean> checkboxMap = new HashMap<Integer,Boolean>();
CheckListener checkListner;
ArrayList<Integer> usedPositionParent = new ArrayList<Integer>();
CheckBox checkBox;
public ListaEspandibileAdapter(Context context, ArrayList<Object> objList){
mContext = context;
_objInt = objList;
popolaCheckMap();
}
public void popolaCheckMap(){
for(int i=0; i< _objInt.size(); i++)
checkboxMap.put(i, false);
}
@Override
public Object getChild(int arg0, int arg1) {
return null;
}
@Override
public long getChildId(int groupPos, int childPos) {
return childPos;
}
@Override
public View getChildView(int groupPos, int childPos, boolean arg2, View convertView,
ViewGroup parent) {
if (convertView == null) {
Log.i("childView", "my parent is "+ groupPos);
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.opportunita_cella_child, null);
EditText descrizioneEditText = (EditText) convertView.findViewById(R.id.opportunita_child_descrizione);
Intervento i = (Intervento) _objInt.get(groupPos);
descrizioneEditText.setText(i.descrizione);
}
return convertView;
}
@Override
public int getChildrenCount(int arg0) {
// i have always one child!
return 1;
}
@Override
public Object getGroup(int arg0) {
return null;
}
@Override
public int getGroupCount() {
return _objInt.size();
}
@Override
public long getGroupId(int groupPos) {
return groupPos;
}
@Override
public View getGroupView(int groupPos, boolean isExpanded, View convertView, ViewGroup parent) {
if(convertView == null) {
Log.i("parentView", "I'am "+ groupPos);
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.opportunita_cella, null);
convertView.setId(groupPos);
checkBox = (CheckBox) convertView.findViewById(R.id.opportunita_checkbox);
checkBox.setFocusable(false);
CheckListener checkL = new CheckListener();
checkL.setPosition(groupPos);
checkBox.setOnCheckedChangeListener(checkL);
Intervento intervento = (Intervento) _objInt.get(groupPos);
ImageView imageView = (ImageView) convertView.findViewById(R.id.opportunita_image);
TextView tipoText = (TextView) convertView.findViewById(R.id.opportunita_tipo);
TextView oggettoText = (TextView) convertView.findViewById(R.id.opportunita_oggetto);
TextView urgenzaText = (TextView) convertView.findViewById(R.id.opportunita_urgenza);
TextView dataText = (TextView) convertView.findViewById(R.id.opportunita_data);
TextView oraText = (TextView) convertView.findViewById(R.id.opportunita_ora);
if(intervento.getTipo().equals("Guasto"))
imageView.setImageResource(R.drawable.ic_intervento);
else if(intervento.getTipo().equals("Programmato"))
imageView.setImageResource(R.drawable.image_programmato);
tipoText.setText(intervento.tipo);
oggettoText.setText(intervento.oggetto);
urgenzaText.setText(intervento.urgenza);
if(intervento.urgenza.equals("Immediata"))
urgenzaText.setTextColor(Color.RED);
else if(intervento.urgenza.equals("Alta"))
urgenzaText.setTextColor(Color.YELLOW);
else if(intervento.urgenza.equals("Media"))
urgenzaText.setTextColor(Color.GREEN);
else if(intervento.urgenza.equals("Bassa"))
urgenzaText.setTextColor(Color.WHITE);
Date d = null;
try {
d = sdf.parse(intervento.data);
} catch (ParseException e) {
e.printStackTrace();
}
String yyyy = String.valueOf(d.getYear()+1900);
String MM = String.valueOf(d.getMonth()+1);
String gg = String.valueOf(d.getDate());
String hh = String.valueOf(d.getHours());
String mm = String.valueOf(d.getMinutes());
if(Integer.parseInt(MM) <= 9)
MM = "0"+MM;
if(Integer.parseInt(gg) <= 9)
gg = "0"+gg;
if(Integer.parseInt(hh) <= 9)
hh = "0"+hh;
if(Integer.parseInt(mm) <= 9)
mm = "0"+mm;
dataText.setText(gg+"-"+MM+"-"+yyyy);
oraText.setText(hh+":"+mm);
}
if(usedPositionParent.contains(convertView.getId())){
//checkBox.setChecked(checkboxMap.get(groupPos));
return convertView;
}
else{
usedPositionParent.add(convertView.getId());
}
//if(isExpanded)
// checkBox.setChecked(checkboxMap.get(groupPos));
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int arg0, int arg1) {
return false;
}
public class CheckListener implements OnCheckedChangeListener{
int pos;
public void setPosition(int p){
pos = p;
}
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Log.i("checkListenerChanged", String.valueOf(pos)+":"+String.valueOf(isChecked));
//checkboxMap.put(pos, isChecked);
}
}
公共类ListAesPandibileLeadApter扩展了BaseExpandableListAdapter{
私人ArrayList_objInt;
语境;
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy-MM-dd-HH:MM”);
//HashMap checkboxMap=新建HashMap();
CheckListener-checkListner;
ArrayList usedPositionParent=新ArrayList();
复选框;
公共列表PandibileLeadApter(上下文,ArrayList对象列表){
mContext=上下文;
_objInt=objList;
popolaCheckMap();
}
public void popolaCheckMap(){
对于(int i=0;i<_objInt.size();i++)
checkboxMap.put(i,false);
}
@凌驾
公共对象getChild(int arg0,int arg1){
返回null;
}
@凌驾
公共长getChildId(int-groupPos,int-childPos){
返回childPos;
}
@凌驾
公共视图getChildView(int-groupPos、int-childPos、布尔值arg2、视图转换视图、,
视图组父项){
if(convertView==null){
Log.i(“childView”,“我的父母是”+groupPos);
LayoutInflater充气器=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.Opportunitita_cella_child,空);
EditText DescriptioneEditText=(EditText)convertView.findViewById(R.id.opportunita\u child\u Descriptione);
interferto i=(interferto)u objInt.get(groupPos);
descrizioneditext.setText(即descrizione);
}
返回视图;
}
@凌驾
公共整数getChildrenCount(整数arg0){
//我一直只有一个孩子!
返回1;
}
@凌驾
公共对象getGroup(int arg0){
返回null;
}
@凌驾
public int getGroupCount(){
返回_objInt.size();
}
@凌驾
公共长getGroupId(int-groupPos){
返回组POS;
}
@凌驾
公共视图getGroupView(int-groupPos、布尔值isExpanded、视图转换视图、视图组父级){
if(convertView==null){
Log.i(“父视图”、“我是”+groupPos);
LayoutInflater充气器=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.Opportunitita_cella,空);
convertView.setId(groupPos);
复选框=(复选框)convertView.findViewById(R.id.Opportunity复选框);
复选框.setFocusable(false);
CheckListener checkL=新的CheckListener();
检查L.设置位置(groupPos);
checkBox.setOnCheckedChangeListener(checkL);
INTERVITETO INTERVITETO=(INTERVITETO)u objInt.get(groupPos);
ImageView ImageView=(ImageView)convertView.findViewById(R.id.Opportunity\u image);
TextView tipoText=(TextView)convertView.findViewById(R.id.opportunitita_tipo);
TextView oggettoText=(TextView)convertView.findViewById(R.id.opportunitita_oggetto);
TextView urgenzaText=(TextView)convertView.findViewById(R.id.Opportunitia_urgenza);
TextView数据text=(TextView)convertView.findViewById(R.id.Opportunity数据);
TextView或text=(TextView)convertView.findViewById(R.id.opportunita_ora);
if(interferto.getTipo().equals(“Guasto”))
imageView.setImageResource(R.drawable.ic_-to);
else if(interferto.getTipo().equals(“Programmato”))
setImageResource(R.drawable.image\u programmato);
tipoText.setText(interferto.tipo);
oggettoText.setText(interferto.oggetto);
urgenzaText.setText(interferto.urgenza);
如果(interferto.urgenza.equals(“立即”))
urgenzaText.setTextColor(Color.RED);
否则,如果(interferto.urgenza.equals(“Alta”))
urgenzaText.setTextColor(Color.YELLOW);
否则,如果(interferto.urgenza.equals(“介质”))
urgenzaText.setTextColor(Color.GREEN);
否则,如果(interferto.urgenza.equals(“Bassa”))
urgenzaText.setTextColor(Color.WHITE);
日期d=空;
试一试{
d=sdf.parse(interferto.data);
}捕获(解析异常){
e、 printStackTrace();
}
字符串yyy=String.valueOf(d.getYear()+1900);
字符串MM=String.valueOf(d.getMonth()+1);
String gg=String.valueOf(d.getDate());
String hh=String.valueOf(d.getHours());
String mm=String.valueOf(d.getMinutes());
if(Integer.parseInt(MM)可能是由于视图循环。是否在getGroupView中使用convert视图
确定一些事情
- 选中时保存复选框的状态,并在getGroupView中设置值
- 实现getGroupId()和getChildId()以使每个组具有唯一且稳定的id(组中的子id是唯一的)
- 如果可以保证稳定的ID,最好重写hastTableIDS()并设置为true
请注意,在ExpandableListView中进行回收有点奇怪,可能需要您的部件进行一些额外的工作
public class ListaEspandibileAdapter extends BaseExpandableListAdapter {
private ArrayList<Object> _objInt;
Context mContext;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//HashMap<Integer,Boolean> checkboxMap = new HashMap<Integer,Boolean>();
CheckListener checkListner;
ArrayList<Integer> usedPositionParent = new ArrayList<Integer>();
CheckBox checkBox;
public ListaEspandibileAdapter(Context context, ArrayList<Object> objList){
mContext = context;
_objInt = objList;
popolaCheckMap();
}
public void popolaCheckMap(){
for(int i=0; i< _objInt.size(); i++)
checkboxMap.put(i, false);
}
@Override
public Object getChild(int arg0, int arg1) {
return null;
}
@Override
public long getChildId(int groupPos, int childPos) {
return childPos;
}
@Override
public View getChildView(int groupPos, int childPos, boolean arg2, View convertView,
ViewGroup parent) {
if (convertView == null) {
Log.i("childView", "my parent is "+ groupPos);
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.opportunita_cella_child, null);
EditText descrizioneEditText = (EditText) convertView.findViewById(R.id.opportunita_child_descrizione);
Intervento i = (Intervento) _objInt.get(groupPos);
descrizioneEditText.setText(i.descrizione);
}
return convertView;
}
@Override
public int getChildrenCount(int arg0) {
// i have always one child!
return 1;
}
@Override
public Object getGroup(int arg0) {
return null;
}
@Override
public int getGroupCount() {
return _objInt.size();
}
@Override
public long getGroupId(int groupPos) {
return groupPos;
}
@Override
public View getGroupView(int groupPos, boolean isExpanded, View convertView, ViewGroup parent) {
if(convertView == null) {
Log.i("parentView", "I'am "+ groupPos);
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.opportunita_cella, null);
convertView.setId(groupPos);
checkBox = (CheckBox) convertView.findViewById(R.id.opportunita_checkbox);
checkBox.setFocusable(false);
CheckListener checkL = new CheckListener();
checkL.setPosition(groupPos);
checkBox.setOnCheckedChangeListener(checkL);
Intervento intervento = (Intervento) _objInt.get(groupPos);
ImageView imageView = (ImageView) convertView.findViewById(R.id.opportunita_image);
TextView tipoText = (TextView) convertView.findViewById(R.id.opportunita_tipo);
TextView oggettoText = (TextView) convertView.findViewById(R.id.opportunita_oggetto);
TextView urgenzaText = (TextView) convertView.findViewById(R.id.opportunita_urgenza);
TextView dataText = (TextView) convertView.findViewById(R.id.opportunita_data);
TextView oraText = (TextView) convertView.findViewById(R.id.opportunita_ora);
if(intervento.getTipo().equals("Guasto"))
imageView.setImageResource(R.drawable.ic_intervento);
else if(intervento.getTipo().equals("Programmato"))
imageView.setImageResource(R.drawable.image_programmato);
tipoText.setText(intervento.tipo);
oggettoText.setText(intervento.oggetto);
urgenzaText.setText(intervento.urgenza);
if(intervento.urgenza.equals("Immediata"))
urgenzaText.setTextColor(Color.RED);
else if(intervento.urgenza.equals("Alta"))
urgenzaText.setTextColor(Color.YELLOW);
else if(intervento.urgenza.equals("Media"))
urgenzaText.setTextColor(Color.GREEN);
else if(intervento.urgenza.equals("Bassa"))
urgenzaText.setTextColor(Color.WHITE);
Date d = null;
try {
d = sdf.parse(intervento.data);
} catch (ParseException e) {
e.printStackTrace();
}
String yyyy = String.valueOf(d.getYear()+1900);
String MM = String.valueOf(d.getMonth()+1);
String gg = String.valueOf(d.getDate());
String hh = String.valueOf(d.getHours());
String mm = String.valueOf(d.getMinutes());
if(Integer.parseInt(MM) <= 9)
MM = "0"+MM;
if(Integer.parseInt(gg) <= 9)
gg = "0"+gg;
if(Integer.parseInt(hh) <= 9)
hh = "0"+hh;
if(Integer.parseInt(mm) <= 9)
mm = "0"+mm;
dataText.setText(gg+"-"+MM+"-"+yyyy);
oraText.setText(hh+":"+mm);
}
if(usedPositionParent.contains(convertView.getId())){
//checkBox.setChecked(checkboxMap.get(groupPos));
return convertView;
}
else{
usedPositionParent.add(convertView.getId());
}
//if(isExpanded)
// checkBox.setChecked(checkboxMap.get(groupPos));
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int arg0, int arg1) {
return false;
}
public class CheckListener implements OnCheckedChangeListener{
int pos;
public void setPosition(int p){
pos = p;
}
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Log.i("checkListenerChanged", String.valueOf(pos)+":"+String.valueOf(isChecked));
//checkboxMap.put(pos, isChecked);
}
}
ArrayList<Boolean> item_checked = new ArrayList<Boolean>();
in starting item_checked.add(false)
holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked)
{
itemChecked.set(position, true);
}
else
{
itemChecked.set(position, false);
}
}
});