2011-11-09 151 views
10

我有一个需要检查/取消检查的项目列表视图。我已经建立了一个ArrayAdapter,它当前使用android.R.layout.simple_list_item_multiple_choice作为行,并且一切都很好。我也能够正确地获得这个项目的点击。但是,选择该项目时,UI 中的复选框不会切换。我一直试图弄清楚这一点,任何人都可以指向正确的方向吗?我只想知道如何强制UI更新以反映复选框的更改状态。以编程方式切换复选框

我可以提供代码,如果需要的话,但我想在这里寻找非常具体的东西,所以我认为发布一堆我的代码不会有太大的帮助。

谢谢!

回答

17

首先通过我这样的回答:Android listview with check boxes?

很高兴为你想实现选中/取消复选框中的ListView,你只需要实现以下getView线()方法:

// also check this lines in the above example 
ViewHolder holder = (ViewHolder) view.getTag(); 
holder.checkbox.setChecked(list.get(position).isSelected()); 

同时检查getView()方法用于事件对复选框的执行驻留在内部的ListView:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.rowbuttonlayout, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) view.findViewById(R.id.label); 
     viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 
     viewHolder.checkbox 
      .setOnCheckedChangeListener(
       new CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, 
         boolean isChecked) { 
        Model element = (Model) viewHolder.checkbox 
          .getTag(); 
        element.setSelected(buttonView.isChecked()); 
       } 
      }); 
     view.setTag(viewHolder); 
     viewHolder.checkbox.setTag(list.get(position)); 
    } else { 
     view = convertView; 
     ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
    } 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    holder.text.setText(list.get(position).getName()); 
    holder.checkbox.setChecked(list.get(position).isSelected()); 
    // ...... 
} 
+1

+1我是你的追随者,你能告诉我该怎么做(阅读/观看)以了解更多关于android,因为你做。谢谢..learnt很多你的回答 – MKJParekh

+0

Thanx为客气话我一直在努力学习一天的话题,做我和我的博客,还有什么需要学习新话题:),你来自哪里? –

+0

印度,我也做这件事来找到并找到至少一个我不知道的话题,并得到有关这个问题的答案..但是有时候我对此感到厌倦/厌倦。但是你们一直在鼓励我。 – MKJParekh

1

您是否尝试过以下方法?

@Override 
public void onListItemClick(ListView listView, View view, int position, long id) { 

    //Invert the checkbox-status   
    ((CheckedTextView) view.findViewById(R.id.text1)).setChecked(!isChecked()); 

    return; 

} 
+0

列表中的项目是动态的 - 每个行项目都没有唯一的XML ID。除非我明白了那个错误?但我试了它,并得到了一个N​​ullPointerException :( – DashRantic

16

在Java代码编程

CheckBox mCheckBox = (CheckBox) findViewById(R.id.checkBox); 

mCheckBox.setChecked(true); //to check 
mCheckBox.setChecked(false); //to uncheck 

在Android的XML

android:checked="true" //to check 
android:checked="false" //to uncheck 

<CheckBox 
    android:id="@+id/checkBox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="true" 
    android:text="Checkbox Item" /> 
0

您可以使用自定义基本适配器。这将允许您一次只选择一个,但您可以通过撤消检查来查看选中哪个选项来更改此选项。

public class CheckBoxGridAdapter extends BaseAdapter{ 

    LayoutInflater inflater; 
    ArrayList<Holder> list; 
    int res; 
    Context context; 

    public CheckBoxGridAdapter(Context context, ArrayList<Holder> list, int layoutResourceId) { 
     inflater = LayoutInflater.from(context); 
     this.context = context; 
     this.list =list; 
     this.res = layoutResourceId; 
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      convertView = inflater.inflate(res, 
        parent, false); 
      holder = new ViewHolder(); 
      holder.tv1 = (TextView) convertView.findViewById(R.id.checkBoxTxt); 
      holder.cb = (CheckBox) convertView.findViewById(R.id.checkBox); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     Holder h = list.get(position); 
     holder.tv1.setText(h.getCBName()); 
     holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
       if(isChecked) 
       { 
        int pos = (Integer) buttonView.getTag(); 
        checkChecks(pos);    
       } 
       CheckBoxGridAdapter.this.notifyDataSetChanged(); 
      } 
     }); 
     holder.cb.setTag(position); 
     holder.cb.setChecked(list.get(position).getSelectState()); 
     return convertView; 
    } 

    protected void checkChecks(int pos) { 
      for(int i = 0;i<list.size();i++) 
      { 
       Holder h = (Holder) list.get(i); 
       if(i==pos) 
       { 
        Log.d(pos +" checked","is checked"); 
        h.setSelectState(true); 
       } 
       else 
       { 
        Log.d(i +" checked","is not checked"); 
        h.setSelectState(false); 
       } 
      } 
    } 

    static class ViewHolder 
    { 
     TextView tv1; 
     CheckBox cb; 
     RadioButton rb; 
    } 

}