10

ここに画像の説明を入力

ArrayAdapter を介して小さな xml サブビューによって設定される listView があります。各小さなビューには、チェックボックスとその横にある文字列ラベルの 2 つしかありません。

ユーザーがチェックボックスをオンまたはオフにするイベントをキャプチャする onCheckedChanged リスナーを設定したいと考えています。

たとえば、ここに示されているリスナー:

 listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

 @Override
 public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

 Toast.makeText(this, "box has been checked", Toast.LENGTH_SHORT).show();

 }

}

リスナーのコードはどこに置くのですか? どうすれば設定できますか?

ArrayAdapter のコード:

  public class MobileArrayAdapter extends ArrayAdapter<CheckBoxInfo>{
    CheckBoxInfo[] objects;
    Context context;
    int textViewResourceId;

    public MobileArrayAdapter(Context context, int textViewResourceId,
        CheckBoxInfo[] objects) {
        super(context, textViewResourceId, objects);
        this.context = context;
        this.textViewResourceId = textViewResourceId;
        this.objects = objects;

    }

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


            if ((row_layout_view == null)){


                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row_layout_view = inflater.inflate(R.layout.row_layout, null);
            }   

          //CheckBoxInfo item = objects.get(position);  // for arrayList
            CheckBoxInfo item = objects[position];

            if(item != null){

            TextView textView = (TextView) row_layout_view.findViewById(R.id.textView1);
            CheckBox checkBox = (CheckBox) row_layout_view.findViewById(R.id.checkBox1);

            if(item !=null){
            textView.setText(item.checkBoxName);
            checkBox.setChecked(item.checkBoxState);
               }
            }
            return row_layout_view;
    }


}
4

4 に答える 4

36

あなたの例listView.setOnCheckedChangeListeneronCheckedChangedコードを使用しないでください。

まず、 の代わりにforCheckBoxを使用する必要があります。関数内でチェック状態を取得できます。setOnClickListener()setOnCheckedChangeListener()onClick()

次に、リスト アダプターsetOnClickListener()の関数の内部に配置します。getView()

checkBox.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        final boolean isChecked = checkBox.isChecked();
        // Do something here.
    }
});
于 2013-04-11T06:01:03.180 に答える
1

onClickListener で「holder.placeCheckBox」を参照しないでください。onClick によって渡されたビューを参照し、それを CheckBox にキャストする必要があるため、コードは次のようになります。

holder.placeCheckBox.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View arg0) {
            boolean isChecked = ((CheckBox)arg0).isChecked();
            if (isChecked){
               objPlace.setItemChecked("yes");
            }else{
               objPlace.setItemChecked("no");
            }

            placesList.set(position,objPlace); //  updating the list with the updated object

        }
  });
于 2015-11-23T07:42:54.203 に答える
0

これを試すことができます:

holder.placeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
        Log.d(TAG, "onCheckedChanged: " + holder.placeCheckBox.getText() + " " + (b ? "selected":"deselected"));
    }
});
于 2016-04-23T15:31:46.040 に答える