2017-02-17 12 views
0

私はチェックボックス付きのカスタムリストビューを持っています。メインレイアウトには「すべて選択」チェックボックスがあります。 「すべて選択」チェックボックスを選択すると、すべてのチェックボックスが選択されます。私が望むのは、リストビューチェックボックスのいずれかを選択解除すると、「すべて選択」チェックボックスも選択解除されなければならないということです。私はhereと表示しようとしましたが、動作しません。リストビューチェックボックスの選択を解除すると、すべてのリストビューチェックボックスが選択解除されます。SelectAllチェックボックスをオフにするチェックボックスをオフにする場合

public class ContactsListAdapter extends BaseAdapter { 
 
    Context ctx; 
 
    LayoutInflater lInflater; 
 
    ArrayList<Contacts> objects; 
 
    CheckBox _selectall; 
 

 
    ContactsListAdapter(Context context, ArrayList<Contacts> products, CheckBox selectall) { 
 
     ctx = context; 
 
     objects = products; 
 
     lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
 
     _selectall=selectall; 
 
    } 
 

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

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

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

 
    @Override 
 
    public View getView(final int position, View convertView, ViewGroup parent) { 
 
     View view = convertView; 
 
     if (view == null) { 
 
      view = lInflater.inflate(R.layout.contact_item, parent, false); 
 
     } 
 
     //final Contacts p = getProduct(position); 
 
     Contacts contacts = objects.get(position); 
 

 
     ((TextView) view.findViewById(R.id.tvName)).setText(contacts.getName()); 
 
     ((TextView) view.findViewById(R.id.tvMobile)).setText(contacts.getMobile()); 
 
     ((TextView) view.findViewById(R.id.tvEmail)).setText(contacts.getEmail()); 
 

 
     final CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox); 
 

 
     cbBuy.setTag(position); 
 
     cbBuy.setChecked(contacts.box); 
 
     if(_selectall.isChecked()){ 
 
      _selectall.setChecked(true); 
 
     }else{ 
 
      _selectall.setChecked(false); 
 
     } 
 

 
     cbBuy.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
 
      @Override 
 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
 

 
       getProduct((Integer) buttonView.getTag()).box = isChecked; 
 

 
       if(_selectall.isChecked()){ 
 
        _selectall.setChecked(true); 
 
       }else{ 
 
        _selectall.setChecked(false); 
 
       } 
 
       notifyDataSetChanged(); 
 

 
      } 
 
     }); 
 

 
     _selectall.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
 
      @Override 
 
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
 

 

 
       if(_selectall.isChecked()){ 
 
        for(int i=0; i<objects.size();i++){ 
 
         getProduct(i).box = true; 
 
         cbBuy.setTag(i); 
 
         cbBuy.setChecked(objects.get(i).box); 
 
        } 
 

 
       }else{ 
 
        for(int i=0; i<objects.size();i++){ 
 
         getProduct(i).box = false; 
 
         cbBuy.setTag(i); 
 
         cbBuy.setChecked(objects.get(i).box); 
 
        } 
 
       } 
 

 
       notifyDataSetChanged(); 
 
      } 
 

 
     }); 
 
     return view; 
 
    } 
 
    Contacts getProduct(int position) { 
 
     return ((Contacts) getItem(position)); 
 
    } 
 

 

 

 
    ArrayList<Contacts> getBox() { 
 
     ArrayList<Contacts> box = new ArrayList<Contacts>(); 
 
     for (Contacts p : objects) { 
 
      if (p.box) 
 
       box.add(p); 
 
     } 
 
     return box; 
 
    } 
 

 

 
}

+0

これを確認してくださいhttp://www.cnblogs.com/vus520/archive/2011/02/27/2561875.html –

答えて

0

私はあなたの選択すべてのチェックボックスがあなたのリストコンポーネントの外にあると信じています。 メンテナンスとして地図を維持する必要はありません。

ロジックをSelectAll setOnCheckedChangeListener putに配置し、アダプタからgetView()を に配置します。そして、これ以上の行ではなく、 notifyDatasetChanged()を呼び出します。あなただけのSelectAllコールの setOnCheckedChangeListenerに確認する必要があり、すべての

だから、最初はとてもすべてのリストのチェックボックスコンポーネントが変更されます、 リストビューのためにnotifyDatasetChanged。すなわちIF(selectAll.isChecked())をするsetSelected(真)としてこの チェックボックスをマークし、そうでない場合はfalse個々のアイテムのチェックボックス を設定してリストビューのGetViewメソッドで

だけチェックを加えます。

特定のリスト項目のsetOnCheckedChangeListener上の最後のものを (selectAll.isChecked())場合は、チェックボックス、すなわち上記と同じチェックを追加 が、偽にだけ設定SelectAllCheckbox。

これが問題を解決します。

+0

私はあなたの提案に従って編集しました。現在の問題は、(ヘッダチェックボックスを選択した後で)リストビューチェックボックスのいずれかを選択解除すると、リストビューチェックボックスは選択解除されますが、ヘッダーチェックボックス@MobileEvangelist –

+0

は機能しません。アクティビティでヘッダチェックボックスonchangelistenerを追加し、adapter.notifyDatasetChangedだけを保持しました。リストビューでchnagelistener 'if(_selectall.isChecked()){ _selectall.setChecked(false); } else { _selectall.setChecked(true); } ' –

+0

if(_selectall.isChecked()){ cBuy.setChecked(true);を追加しました。 } else { cBuy.setChecked(false); else } getView()内のfindviewByIdとsetTagの直後。? – MobileEvangelist

1

on checkedChangedListenerチェックボックスの合計項目をチェックします。合計アイテムと等しい場合は、[すべて]チェックボックスをオンにします。そうでない場合はfalseです。詳細な例はhere

関連する問題