2011-11-09 13 views
10

私はチェック可能/チェック解除が必要な項目のListViewを持っています。私は現在、android.R.layout.simple_list_item_multiple_choiceを行として使用しているArrayAdapterをセットアップしており、すべてがうまく表示されます。私はこのアイテムを適切にクリックすることもできます。ただし、項目が選択されている場合、のチェックボックスはを切り替えません。私はしばらくこのことを理解しようとしてきました。誰かが私を正しい方向に向けることができますか? UIを強制的に更新して、チェックボックスの変更された状態を反映させる方法を知りたいだけです。チェックボックスをプログラムで切り替えます

私は必要に応じてコードを提供することができますが、ここでは非常に具体的なものを探すようにしています。

ありがとうございます!

答えて

17

まず第一には、私のこの回答を経る:あなたはリストビューで確認/未チェックのチェックボックスを実装するとして、あなただけのgetViewメソッド(の行の下に実装する必要がAndroid listview with check boxes?

ニース)方法:

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

リストビュー内に存在するチェックボックスをイベントの実装のためのgetViewメソッド()メソッドをチェック:

@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あなたのフォロワーです、あなたはあなたが行うようにアンドロイドについてもっと知るために何をすべきか(読んで/見る)教えてくださいできます!あなたの答え。 – MKJParekh

+0

親切な言葉のためのThanx私はいつも一日の話題を学び、そして私とあなたのブログをやっています。 –

+0

インド、私はまた、物事をSOに来て、私が知りませんし、それについての質問と答えを得る少なくとも一つの話題を見つける。しかし、いつかいつかは退屈している/それをやって疲れている..しかし、皆さんは私を励まし続ける。 – 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はありません。私が間違ったことを理解していない限り?しかし、私はとにかくそれを試してみて、NullPointerExceptionを得た:( – DashRantic

16

プログラムでJavaコードで

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

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

アンドロイド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

としてカスタムベースアダプタを使用することができます。これにより、一度に1つだけを選択できるようになりますが、チェックを元に戻して選択したものが表示されるようにすることで、これを変更することができます。

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

} 
関連する問題