Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:自定义可扩展列表和复选框问题。为什么支票箱状态是随机的?_Android_Checkbox_Expandablelistview_Baseadapter - Fatal编程技术网

Android:自定义可扩展列表和复选框问题。为什么支票箱状态是随机的?

Android:自定义可扩展列表和复选框问题。为什么支票箱状态是随机的?,android,checkbox,expandablelistview,baseadapter,Android,Checkbox,Expandablelistview,Baseadapter,问题是: 为什么会这样?? 若我选中“媒体”附近的复选框并展开节点,复选标记将转到第二个子节点。 我不明白为什么 EDIT1:已解决复选框状态。另一个问题发生了 但是,也许我刚刚明白问题不在状态!!!问题是切换的行的位置!如果我在刚加载视图时放置了一个数组进行检查,那么复选框状态工作得很好!问题是视图位置!情况就是这样: row0: parentA + checkBoxMARKED row1: parentB + checkBoxNOTmarked 点击一个按钮,这应该会发生: row0:

问题是:

为什么会这样?? 若我选中“媒体”附近的复选框并展开节点,复选标记将转到第二个子节点。 我不明白为什么

EDIT1:已解决复选框状态。另一个问题发生了

但是,也许我刚刚明白问题不在状态!!!问题是切换的行的位置!如果我在刚加载视图时放置了一个数组进行检查,那么复选框状态工作得很好!问题是视图位置!情况就是这样:

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);
                  }
 }
});