2011-11-28 76 views
11

multiple_checkboxesnotifyDataSetChanged爲多個複選框

在附加的圖像,SelectAll checkbox存在與一個活動,並且適配器內的所有checkboxes。 如果我checked SelectAll那麼所有的複選框都在適配器中檢查,如果我未選中,那麼所有複選框都未選中。它的發生很好。

但我想如果我checked SelectAll和之後,如果我uncheked一個或多個複選框在tha適配器然後SelectAll checkbox should unchecked。 ,如果沒有檢查SelectAll如果我手動檢查適配器中的所有複選框然後SelectAll checkbox should checked自動。

我該怎麼做。

波紋管是我的代碼, http://pastebin.com/5pUJJC42

+0

你應該檢查下面的鏈接來解決你的問題....這裏是[鏈接](http://stackoverflow.com/questions/7738527/getting-an-issue-while-checking-the-dynamically - 生成-複選框,通過列表/ 7739006#7739006)。 – himanshu

回答

2

可以使相應的產品清單和適配器,你應該相應地切換選中/取消布爾值布爾值的數組,並在適配器上每檢查布爾數組的所有元素是否爲真?然後setcheck(true)selectall_checkbox否則保持setchecked(未選中)。

+0

我沒有準確。你可以給我一些示例代碼 – Jyosna

+0

只需檢查我的代碼我附加了什麼,我已經做了使用Model類,其中我拿了一個布爾變量,併爲每個檢查我設置值爲該布爾值。 – Jyosna

+0

嘗試我粘貼的新代碼 –

2

編輯

適配器應該是這樣的:

public class InteractiveArrayAdapter extends ArrayAdapter<Model> { 
    private final List<Model> list; 
    private final Activity context; 
    private CheckBox selectAll; 

    public InteractiveArrayAdapter(Activity context, List<Model> list, CheckBox selectAll) { 
    super(context, R.layout.list_items_attendance_payment, list); 
    this.context = context; 
    this.list = list; 
    this.selectAll = selectAll; 
    } 

    static class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
    View view = null; 

    if(convertView == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.list_items_attendance_payment, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) view.findViewById(R.id.name); 
     viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 
     view.setTag(viewHolder); 
    } 
    else { 
     view = convertView; 
    } 

    ViewHolder holder = (ViewHolder) view.getTag(); 
    holder.text.setText(list.get(position).getName()); 

    viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     AttendanceActivity.listMember.get(position).setSelected(isChecked); 
     list.get(position).setSelected(buttonView.isChecked()); 
     selectAll.setChecked(areAllSelected()); // We just use the method as parameter as it returns a boolean. 
     } 
    }); 

    if(selectAll.isChecked()) 
     holder.checkbox.setChecked(true); 
    else 
     holder.checkbox.setChecked(list.get(position).isSelected()); 

    return view; 
    } 

    public void deselectAll() { 
    for(Model element : list) 
     element.setSelected(false); 

    notifyDataSetChanged(); 
    } 

    public void selectAll() { 
    for(Model element : list) 
     element.setSelected(true); 

    notifyDataSetChanged(); 
    } 

    private boolean areAllSelected() { 
    for(Model element : list) 
     if(!element.getSelected()) 
     return false; // We conclude that not all are selected. 

    return true; // All of the items were selected 
    } 
} 

而在你Activity設置該OnCheckedChangedListener應改爲此方法:

private void onClickSetAllAttendance() { 
    selectAll.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     CheckBox box = (CheckBox) v; 
     box.toggle(); 

     if(box.isChecked()) 
     listAdapter.selectAll(); 
     else 
     listAdapter.deselectAll(); 
    } 
    }); 
} 
+0

不,它也不能正常工作。 – Jyosna

+0

我改變了我的答案以顯示完整的實現。 – kaspermoerch

+0

我嘗試過使用這段代碼,但它仍然有一些問題。如果所有選項都被選中,並且如果我將從適配器中取消選中其中的一個,那麼selectAll複選框應該取消選中,但這裏全部變成未選中狀態。 – Jyosna

3

我試着它是這樣的,

將checkAll複選框傳遞給Adapter類的構造函數,並將其設置爲Listener本身,以便我們不需要從Main類聲明任何標誌public static。

另外我拿了幾個標誌來維護複選框的狀態,也就是我試圖保持這種狀態,當checkAll複選框檢查被更改時,它不會影響List Items複選框,反之亦然List Item複選框check 。

所以,試試這個

public class myAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 
    private CheckBox checkAll; 
    boolean checkAll_flag = false; 
    boolean checkItem_flag = false; 

    public myAdapter(Activity context, List<Model> list, CheckBox checkAll) { 
     super(context, R.layout.row, list); 
     this.context = context; 
     this.list = list; 
     this.checkAll = checkAll; 
     checkAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton checkbox, boolean arg1) { 
       if(!checkItem_flag){ 
        checkAll_flag = true; 
        notifyDataSetChanged(); 
       } 
      } 
     }); 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected CheckBox checkbox; 
    } 

    private boolean areAllSelected() { 

     boolean areAllSelected = false; 

      for (int i = 0; i < list.size(); i++) { 
       if(list.get(i).isSelected()){ 
        areAllSelected = true; 
       } 
       else{ 
        areAllSelected = false; 
        return areAllSelected; 
       } 
      } 
      return areAllSelected; 
     } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.row, 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()); 

          if(!checkAll_flag){ 
           checkItem_flag = true; 
           if(buttonView.isChecked()){ 
            checkAll.setChecked(areAllSelected()); 
           } 
           if(!buttonView.isChecked()){ 
            checkAll.setChecked(areAllSelected());        
           } 
           checkItem_flag = false; 
          } 
         } 
        }); 
      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());  

     if(checkAll_flag){ 
      if(checkAll.isChecked()){ 
       holder.checkbox.setChecked(true); 
      } 
      else if(!checkAll.isChecked()){ 
       holder.checkbox.setChecked(false); 
      } 
      if(position == (list.size() -1)){ 
       checkAll_flag = false; 
      } 
     } 
     return view; 
    } 
} 
+0

不錯的嘗試..呃一個。 – Dharmendra

2

這是給你一個簡單的解決方案。

@Override 
public View getView(int position, View v, ViewGroup arg2) { 
    final PillTime pillTime = arrPillTimes.get(position); 
    if(v == null) { 
     v = inflater.inflate(R.layout.select_time_row, null); 
    } 
    TextView tvTitle = (TextView)v.findViewById(R.id.tvTitle); 
    TextView tvTime = (TextView)v.findViewById(R.id.tvTime); 

    tvTime.setText(pillTime.getTime()); 

    final CheckBox cbtime = (CheckBox)v.findViewById(R.id.cbtime); 
    cbtime.setChecked(false); 
    for (PillTime pillTime2 : arrSelectedTimes) { 
     if(pillTime2.getId().equals(pillTime.getId())) { 
      cbtime.setChecked(true); 
      break; 
     } 
    } 
    tvTitle.setText(pillTime.getTitle()); 
    cbtime.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if(cbtime.isChecked()) { 
       boolean contains = false; 
       for (PillTime pillTime2 : arrSelectedTimes) { 
        if(pillTime2.getId().equals(pillTime.getId())) { 
         contains = true; 
         break; 
        } 
       } 
       if(!contains) { 
        arrSelectedTimes.add(pillTime); 
        if(arrPillTimes.size() == arrSelectedTimes.size()) { 
         cbSelectAll.setChecked(true); 
        } 
       } 
      }else { 
       for (PillTime pillTime2 : arrSelectedTimes) { 
        if(pillTime2.getId().equals(pillTime.getId())) { 
         arrSelectedTimes.remove(pillTime2); 
         cbSelectAll.setChecked(false); 
         break; 
        } 
       } 
      } 
     } 
    }); 

    return v; 
} 

我有一個擁有所有數據的一個主要的ArrayList arrPillTimes,我有第二ArrayList的 arrSelectedTimes將保持檢查軌道items.We將檢查選擇的項目是arrSelectedTimes這意味着你已經檢查了項目所以你必須爲該複選框設置checked屬性爲true。

3

我以前有類似的問題。你需要你的行視圖來實現Checkable。檢查this question

1

嘗試使用CheckedTextView此問題

爲主。XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" android:background="#ffffff"> 

    <ListView 
     android:id="@+id/listView" 
     android:scrollbars="vertical" android:divider="#C0C0C0" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:cacheColorHint="#00000000" android:dividerHeight="1dip"> 
    </ListView> 
    <LinearLayout android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:layout_width="match_parent"> 
     <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="All"></Button> 
     <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="None"></Button> 
     <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Done"></Button> 
    </LinearLayout> 

</LinearLayout> 

listrow.xml

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/text" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:gravity="center_vertical" 
    android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
    android:background="#ffffff" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="#000000" android:padding="15dip"/> 

CheckedTextVwActivity.java

import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.CheckedTextView; 
import android.widget.ListView; 
import android.widget.Toast; 

public class CheckedTextVwActivity extends Activity { 
    /** Called when the activity is first created. */ 
    ListView listView; 
    ListAdapter adapter; 
    ArrayList<String> strings = new ArrayList<String>(); 
    Button button1,button2,button3; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     listView = (ListView) findViewById(R.id.listView); 
     button1 = (Button) findViewById(R.id.button1); 
     button2 = (Button) findViewById(R.id.button2); 
     button3 = (Button) findViewById(R.id.button3); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     strings.add(new String("B")); 
     strings.add(new String("A")); 
     TopicSelectionListAdapter topicSelectionListAdapter = new TopicSelectionListAdapter(
       CheckedTextVwActivity.this, R.layout.listrow, strings); 
     listView.setAdapter(topicSelectionListAdapter); 
     listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
     for(int i=0;i<strings.size();i++){ 
      listView.setItemChecked(i, true); 
     } 

     listView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View view, int position, 
        long arg3) { 
       CheckedTextView selectedItem = (CheckedTextView) view; 
       boolean isChecked = selectedItem.isChecked(); 
       Log.e("TAG","item clicked position = " + position + " isChecked = " + isChecked);    
      } 
     }); 

     button1.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       for(int i=0;i<strings.size();i++){ 
        listView.setItemChecked(i, true); 
       } 
      } 
     }); 

     button2.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       for(int i=0;i<strings.size();i++){ 
        listView.setItemChecked(i, false); 
       } 
      } 
     }); 

     button3.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       int count = listView.getAdapter().getCount(); 
       String savedItems = null; 
       for (int i = 0; i < count; i++) { 

        if (listView.isItemChecked(i)) { 
          savedItems = savedItems + listView.getItemAtPosition(i).toString() + ","; 
        } 

       } 
       Toast.makeText(CheckedTextVwActivity.this, ""+savedItems, Toast.LENGTH_LONG).show(); 
      } 
     }); 


    } 

    public class TopicSelectionListAdapter extends ArrayAdapter { 
     @SuppressWarnings("unchecked") 
     public TopicSelectionListAdapter(Context context, 
       int textViewResourceId, List objects) { 
      super(context, textViewResourceId, objects); 
     } 

     @Override 
     public long getItemId(int currentPosition) { 
      return super.getItemId(currentPosition); 
     } 

     @Override 
     public View getView(int currentPosition, View convertView, 
       ViewGroup parent) { 
      View v = convertView; 
      final LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.listrow, null); 
      final CheckedTextView textView = (CheckedTextView) v 
      .findViewById(R.id.text); 
      textView.setText(strings.get(currentPosition)); 
      return v; 
     } 
    } 
}