2011-11-09 42 views
10

Tôi có một ListView của các mục cần phải kiểm tra/không thể kiểm tra. Tôi đã thiết lập một ArrayAdapter hiện đang sử dụng android.R.layout.simple_list_item_multiple_choice làm hàng và mọi thứ đều hiển thị tốt. Tôi cũng có thể nhận được các nhấp chuột vào mục này một cách chính xác. Tuy nhiên, hộp kiểm trong giao diện người dùng không chuyển đổi khi mục được chọn. Tôi đã cố gắng để tìm ra điều này trong một thời gian, bất cứ ai có thể chỉ cho tôi đi đúng hướng? Tôi chỉ muốn biết cách buộc giao diện người dùng cập nhật để phản ánh trạng thái đã thay đổi của hộp kiểm.Chuyển đổi hộp kiểm theo chương trình

Tôi có thể cung cấp mã nếu cần, nhưng tôi đang cố tìm một thứ gì đó rất cụ thể ở đây, vì vậy tôi thấy việc đăng một loạt mã của tôi sẽ không giúp được gì nhiều.

Cảm ơn!

Trả lời

17

Trước hết đi qua câu trả lời của tôi này: Android listview with check boxes?

đẹp như bạn muốn thực hiện kiểm tra/hộp kiểm được kiểm soát trong ListView, bạn chỉ cần thực hiện dưới dòng trong getView() phương pháp:

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

Ngoài ra kiểm tra phương pháp getView() để thực hiện các sự kiện trên CheckBox cư trú bên trong 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 i am theo của bạn, bạn có thể xin vui lòng cho tôi biết phải làm gì (đọc/xem) để biết thêm về android như bạn làm.! Cảm ơn .. rất nhiều từ – MKJParekh

+0

Thanx cho các từ ngữ, tôi luôn cố gắng tìm hiểu một chủ đề trong một ngày và làm SO và blog của tôi. Còn gì khác cần phải học chủ đề mới :), bạn từ đâu đến? –

+0

Ấn Độ, tôi cũng làm điều đến SO và tìm thấy ít nhất một chủ đề tôi không biết và nhận được câu hỏi và câu trả lời về điều đó .. nhưng đôi khi tôi đã chán/mệt mỏi vì làm điều đó .. nhưng các bạn vẫn khuyến khích tôi. – MKJParekh

1

Bạn đã thử những điều sau đây chưa?

@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

Các mục trong danh sách là động - không có ID XML duy nhất cho mỗi mục hàng. Trừ khi tôi hiểu được điều đó sai? Nhưng tôi đã thử nó anyway, và có một NullPointerException: ( – DashRantic

16

lập trình trong mã java

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

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

Trong android XML

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

như

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

Bạn có thể sử dụng một bộ chuyển đổi cơ sở tùy chỉnh. Điều này sẽ cho phép bạn chọn duy nhất một lúc, nhưng bạn có thể thay đổi điều này bằng cách hoàn tác kiểm tra để xem cái nào được chọn.

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

} 
Các vấn đề liên quan