当旧视图返回时,Android setOnCheckedChangeListener会再次调用 [英] Android setOnCheckedChangeListener calls again when old view comes back

查看:213
本文介绍了当旧视图返回时,Android setOnCheckedChangeListener会再次调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法解决getGroupView方法的问题。

I cannot solve an issue with the getGroupView-method.

问题是侦听器setOnCheckedChangeListener被调用多次。

the problem is that the listener setOnCheckedChangeListener is getting invoked to many times.

假设我检查某个复选框项。然后我将它滚出视图,然后向后滚动。发生的是,监听器再次被调用。问题是,我将checkbox-id存储在这个监听器中的arraylist中,以便稍后在代码中使用它。结果是,每当调用监听器时,更多的元素被添加到数组列表,并使数据失真。

Let say i check a certain checkbox-item. Then I scroll it out of view and then scroll back. What happends is that the listener is called once again. And the problem is that I store checkbox-id's in an arraylist inside this listener to use it later in the code. The consequence is that more elements is added to the arraylist everytime the listener is called and distortes the data.

有没有解决方案?我该怎么办?

Is there a solution to this? what should I do? Should I for instance unregister the listener?

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


推荐答案

使用?

这似乎是一个问题的多个组件,特别是与checkedChange()方法(CheckBox,RadioButton),我不能提供一个很好的解释为什么它发生。

It seems to be an issue for multiple components, especially with a checkedChange() method (CheckBox, RadioButton) and I can't provide a good explanation why it is happening.

我会假设,因为它注册的位置状态的变化,并抓住其他属性的变化? 此处处理了类似的问题

I would assume because it registers the change of the position state and grabs the change of other properties? A similar issue was addressed here

无论如何,解决这个问题的办法是添加 OnClickListener()

In any case, a workaround around this could be to add an 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

      }
    });

这篇关于当旧视图返回时,Android setOnCheckedChangeListener会再次调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆