2012-07-16 84 views
0

我有一個listivew自定義arrayadapter和自定義佈局,它有一個複選框。 我想讓這個listview只啓用一個複選框,但我不知道我該怎麼做。listview with checkbox single clickable

這是我的適配器,但檢查和取消選中不工作正常。請任何人舉例。

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 2012-07-16 09:26:51

+0

使用切換按鈕,而不是複選框,並創建選擇器xml文件在drawable folder.rather比使用arrayAdapter使用BaseAdapter,這將很容易實現 – AkashG 2012-07-16 09:30:32

+0

@Shubhayu是的,如果我檢查一個,其他人被取消選中。 – rbrlnx 2012-07-16 09:34:31

回答

1

這應該照顧您的要求。關於如何實現這一目標的非常好的教程。

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

所以基本豐達是,

  1. 擴展布局(線性/相對),並實現可檢查界面。
  2. 膨脹佈局後,找出哪個孩子被選中,並檢查相應的複選框。取消選中任何其他以前檢查過的項目。
  3. 確保您的ListView的XML具有以下標記爲[機器人:choiceMode = 「singleChoice」]
+0

請不要只是在沒有任何解釋或摘要的情況下連接到Stackoverflow之外。稍微詳細一點。 =) – 2012-07-16 09:41:22

+0

需要點:)希望它不是剽竊:P – Shubhayu 2012-07-16 09:42:06

+0

不,這將是公然撕裂整篇文章並將其作爲自己的文章傳遞。根據大多數版權法,引用是允許的。 =) – 2012-07-16 09:42:25

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

} 
相關問題