2012-02-20 1 views
0

問題はこれです:Android:カスタムエキスパンドリストとチェックボックスの問題。 Chechboxの状態がランダムなのはなぜですか?

http://img204.imageshack.us/img204/6071/immaginety.png

はなぜ起こります? "Media"の近くをチェックしてノードを展開すると、チェックマークが2番目の子に移動します。 私は理由を理解していません

EDIT1:解決済みのチェックボックスの状態。別の問題が発生する!!

しかし、多分私は問題がcheckBoxの状態ではないことを理解しているかもしれません!問題は、切り替わる行の位置です!私は、ビューがちょうど読み込まれたときにチェックするための配列を置く場合、チェックボックスの状態はうまく動作します!問題はビュー位置です!

row0: parentA + checkBoxMARKED 

row1: parentB + checkBoxNOTmarked 

Aをクリックして、これが起こることになっている:これは何が起こるかです

row0:  parentA + checkBoxMARKED 
subRow0: --childA 
row1:  parentB + checkBoxNOTmarked 

をしかし、逆に、これは(親スイッチ)を発生

row1: parentB + checkBoxNOTmarked 
subRow0: --childA 
row0: parentA + checkBoxMarked 

今、私はこの行をコメントする場合

if(usedPositionParent.contains(convertView.getId())){ 

      return convertView; 
     } 
     else{ 
      usedPositionParent.add(convertView.getId()); 
} 

Si A上の

row0: parentA + checkBoxMARKED 

row1: parentB + checkBoxNOTmarked 

クリックし、発生します:tuationはなり

row1:  parentA + checkBoxNOTmarked 
subRow1: --childA 
row0:  parentB + checkBoxMARKED 

しかし、現実には、parentAは行0です!だから、それはcheckBoxの問題ではありません。それは親の位置問題です!あなたはどう思いますか?おそらく

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

}

+0

編集アダプタ – jeet

+0

のあなたのコードをポスト:)。見てください – kinghomer

答えて

0

リサイクルを見ることが原因:

これは新しいコードです。 getGroupViewでコンバートビューを使用していますか?

は、あなたがチェックすると、チェックボックスの状態を保存し、getGroupViewに値を設定するいくつかのもの

  • ていることを確認します。
  • getGroupId()およびgetChildId()を実装して、グループごとに固有の安定したIDを持つようにしました(子IDはグループ内で一意です)。
  • 安定したIDを約束できる場合は、hasStableIds()をオーバーライドしてtrueに設定することをお勧めします。

ExpandableListViewでリサイクルするのはちょっと変わったことに注意してください。マニュアルから:

convertView可能であれば、古いビューを再利用してください。使用する前に、このビューがnullではなく、適切なタイプであることを確認する必要があります。 このビューを変換して正しいデータを表示できない場合は、 このメソッドは新しいビューを作成できます。 convertViewが以前にgetGroupView(int、 boolean、View、ViewGroup)によって作成されているとは限りません。

+0

はい私はです。だから、私は別の配列で、それぞれのチェックボックスの状態を保存し、 'setChecked'をgroupviewで設定する必要がありますか?あなたは私に例を教えていただけますか?リストが読み込まれたとき、状態が常に「偽」であるという事実を考慮する必要があります。それから、私はそれを真実にチェックすることができ、見つかったそれぞれの真のために、その行を私のdbに保存します。 – kinghomer

+0

はい。おそらくメモリに保存したい場合は、これが最も簡単な方法です。 1.膨張時にOnCheckedChangedListenerを設定します。 2.チェックボックスの参照される行IDは、バインド時に常にタグとして設定します。 3.チェックボックスにタグとして保存したIDを使用してチェックイベントが発生すると、たとえばSparseBooleanArrayにチェック状態を設定します。 4. SparseBooleanArrayの値を使用してbindViewでCaLl setCheckedを実行します。 選択肢の倍数という概念もありますが、拡張可能なリストビューafaikで動作することはありません。 –

+0

何もない!私はそれをすることはできません。それは少し難しいです:/ – kinghomer

0

使用この:

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

何もクビ!それでも問題は発生します。 – kinghomer

関連する問題