1. ホーム
  2. android

[解決済み] Android setOnCheckedChangeListenerは古いビューが戻ってきたときに再度呼び出されます。

2022-02-26 05:31:28

質問

getGroupView-methodで問題が解決できません。

問題は、リスナー setOnCheckedChangeListener が何度も呼び出されることです。

あるチェックボックスの項目にチェックを入れたとします。そして、それをスクロールして表示から外し、またスクロールして戻るとします。このとき、リスナーはもう一度呼び出されます。問題は、リスナーの内部でチェックボックスのIDを配列リストに保存して、後でそれを使うことです。その結果、リスナーが呼び出されるたびに配列リストに要素が追加され、データに歪みが生じています。

これに対する解決策はあるのでしょうか?例えば、リスナーの登録を解除すべきでしょうか?

@Override
 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
     View view = null;

     final int group_position = groupPosition;
     if (convertView == null) {
         LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         view = inflater.inflate(R.layout.activity_phrase, parent, false);
         final ViewHolder viewHolder = new ViewHolder();
         viewHolder.text = (TextView) view.findViewById(R.id.groupTitle);
         viewHolder.checkBox = (CheckBox) view.findViewById(R.id.check);
         viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub

                if (buttonView.isChecked()) {
                    checked.add((Integer) viewHolder.checkBox.getTag());
                }
                else {
                    checked.remove((Integer) viewHolder.checkBox.getTag());
                }

            }
        });

        view.setTag(viewHolder);
        viewHolder.checkBox.setTag(groupPosition);

     } else {
         view = convertView;
         ((ViewHolder)view.getTag()).checkBox.setTag(groupPosition);
     }

     ViewHolder holder = (ViewHolder) view.getTag();
     holder.text.setText(titles[groupPosition]);

     for (int i = 0; i < checked.size(); i++) {
         if (checked.get(i) == group_position) {
             holder.checkBox.setChecked(true);
         }
         else if (checked.get(i) != group_position) {
             holder.checkBox.setChecked(false);
         }
     }

     return view;
 }

解決するには?

お使いのAndroidのバージョンは?

複数のコンポーネント、特にcheckedChange()メソッドを持つコンポーネント(CheckBox、RadioButton)で発生する問題のようで、その理由をうまく説明できないのですが、どうしたらよいでしょうか?

位置状態の変化を登録し、他のプロパティの変化を掴むからと推測しますが?似たような問題で こちら

いずれにせよ、これを回避する方法として OnClickListener() .

CheckBox yourCheckBox = (CheckBox) findViewById (R.id.yourId);

yourCheckBox.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
                //is chkIos checked?
        if (((CheckBox) v).isChecked()) {
                         //Case 1
        }
        else 
          //case 2

      }
    });