2012-07-16 4 views
0

맞춤 배열 어댑터 및 맞춤 레이아웃이있는 listivew가 있는데, 확인란이 있습니다. 이 목록보기를 하나만 사용하도록 설정하려고하지만 어떻게 할 수 있는지 잘 모릅니다.체크 박스가있는 목록보기 클릭 한번만 가능

이것은 내 어댑터이지만 확인 및 선택 취소는 제대로 작동하지 않습니다. 어떤 exmple하시기 바랍니다.

public class gremioAdapter extends ArrayAdapter<Gremio> { 

Context context; 
int layoutResourceId; 
ArrayList<Gremio> data = null; 
protected String comentarioAlEdiText; 

public gremioAdapter(Context context, int layoutResourceId, ArrayList<Gremio> data) 
{ 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

public void updateDataSet(Gremio objetoGremioAnadir) { 
    this.data.add(objetoGremioAnadir); 
    notifyDataSetChanged(); 

} 

public void updateDataSet(Gremio objetoGremioAnadir, int posicion) { 
    this.data.add(posicion, objetoGremioAnadir); 
    notifyDataSetChanged(); 

} 

public void updateDataSet(String comentario, int posicion) { 
    this.data.get(posicion).comentario = comentario; 
    notifyDataSetChanged(); 

} 
public void updateDataSet() { 

    notifyDataSetChanged(); 

} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    GremioHolder holder = null; 
    final GremioHolder h2 = holder; 


    if (row == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new GremioHolder(); 
     holder.tvGremio = (TextView) row.findViewById(R.id.tvGremio); 
     holder.cbActivo = (CheckBox) row.findViewById(R.id.cbGremioActivo); 
     holder.tvComentario = (TextView) row.findViewById(R.id.tvComentario); 

     row.setTag(holder); 
    } 
    else { 
     holder = (GremioHolder) row.getTag(); 
    } 

    Gremio gremioFinal = data.get(position); 

    holder.tvGremio.setText(gremioFinal.literal); 
    holder.tvComentario.setText(gremioFinal.comentario); 

    if (data.get(position).getActivo().equals("1")) { 
     holder.cbActivo.setChecked(true); 
    } 
    else { 
     holder.cbActivo.setChecked(false); 
    } 

    holder.cbActivo.setOnClickListener(new OnClickListener() 
    { 


     @Override 
     public void onClick(View v) { 
      if (data.get(position).activo.equals("0")) 
       h2.cbActivo.setChecked(true); 
      if (data.get(position).activo.equals("1")) 
       h2.cbActivo.setChecked(false); 

     } 
    }); 
    holder.cbActivo.setOnCheckedChangeListener(new OnCheckedChangeListener() 
    { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

       if (!isChecked) { 
        for (int i = 0; i < data.size(); i++) { 
         data.get(i).activo = "0"; 
        } 
        data.get(position).activo = "1"; 
       } 
       if (isChecked) { 
        for (int i = 0; i < data.size(); i++) { 
         data.get(i).activo = "0"; 
        } 
       } 

       notifyDataSetChanged(); 

      } 
     }); 

     return row; 
    } 

    public class GremioHolder { 
     TextView tvGremio; 
     CheckBox cbActivo; 
     TextView tvComentario; 
    } 
} 

} 
+0

상호 배타적이라고 말하고 싶습니까? 즉, 하나의 체크 박스를 체크하면 다른 체크 박스는 체크하지 않아야합니까? – Shubhayu

+0

checkbox 대신 button을 사용하고 drawable 폴더에 create selector xml 파일을 사용하십시오. arrayAdapter를 사용하는 것보다 구현하기가 쉬운 BaseAdapter를 사용하십시오. – AkashG

+0

@Shubhayu 예, 하나를 선택하면 나머지는 선택 취소됩니다. – rbrlnx

답변

1

귀하의 요구 사항을 따라야합니다. 당신이 이것을 어떻게 달성 할 수 있는지에 대한 아주 좋은 지침서.

http://tokudu.com/2010/android-checkable-linear-layout/

그래서 기본 funda는

  1. 이 레이아웃 (상대 선형을 /) 확장 및 체크 가능 인터페이스를 구현한다는 것입니다.
  2. 레이아웃을 부 풀린 다음 어떤 자식이 선택되었는지 확인하고 해당 확인란을 선택하십시오. 이전에 선택한 다른 항목을 선택 취소하십시오.
  3. 당신의 ListView의 XML은 다음과 같은 표시가 있는지 확인 [안드로이드 : choiceMode = "singleChoice을"]
+0

설명이나 요약없이 Stackoverflow 외부로 링크하지 마십시오. 조금 정교 해. =) –

+0

취한 포인트 :) 비록 표절이 아니길 바래요 : P – Shubhayu

+0

아니, 그것은 뻔뻔스럽게도 전체 기사를 찢어 버리고 자신의 것으로 넘길 것입니다. 대부분의 저작권법에 따라 인용이 허용됩니다. =) –

1

는 이 당신의 getView() 메소드에서 변경 ... 당신에게 유용한 홉.

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     final Holder holder; 
     if (vi == null) { 
      vi = inflater.inflate(R.layout.raw_customelabel_list, null); 
      holder = new Holder(); 

      holder.txtname = (TextView) vi 
        .findViewById(R.id.raw_customlabel_txt_name); 
      holder.checkbox = (CheckBox) vi 
        .findViewById(R.id.raw_customlabel_checkbox); 
      vi.setTag(holder); 

     } else { 
      holder = (Holder) vi.getTag(); 
     } 

     vi.setTag(holder); 
     holder.txtname.setText(strarry[position]); 

     holder.checkbox.setId(position); 
     holder.checkbox.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       for (int i = 0; i < strarry.length; i++) { 
        if (v.getId() == i) { 
         checkarry[i] = true; 
         Log.v("check", ""+position); 
        } else { 
         checkarry[i] = false; 
        } 
       } 
       notifyDataSetChanged(); 
      } 
     }); 

     if (checkarry[position]) { 
      holder.checkbox.setChecked(true); 
     } else { 
      holder.checkbox.setChecked(false); 
     } 

     return vi; 
    } 

} 
관련 문제