Android:仅在第一个选中时启用第二个复选框

时间:2016-06-15 13:15:22

标签: android listview checkbox

我正在使用自定义数组适配器并在同一行上有两个复选框。只有在检查第一个时才应启用第二个。我没有看到如何从第一个列表框的onClickListener获取第二个列表框的句柄。

    private class MyCustomAdapter extends ArrayAdapter<DiatonicMajorKey> {

    private ArrayList<DiatonicMajorKey> keyList;

    public MyCustomAdapter(Context context, int textViewResourceId,
                           ArrayList<DiatonicMajorKey> keyList) {
        super(context, textViewResourceId, keyList);
        this.keyList = new ArrayList<DiatonicMajorKey>();
        this.keyList.addAll(keyList);
    }

    // this class holds the items that actually appear on the screen.
    private class ViewHolder {
        TextView code;
        CheckBox key;
        CheckBox inversion;
    }

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

        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.key_info, null);


            holder = new ViewHolder();
            holder.code = (TextView) convertView.findViewById(R.id.keycode);
            holder.key = (CheckBox) convertView.findViewById(R.id.checkBox1);
            holder.inversion = (CheckBox) convertView.findViewById(R.id.checkBox2);
            convertView.setTag(holder);

            holder.key.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    CheckBox cb = (CheckBox) v;
                    DiatonicMajorKey _key = (DiatonicMajorKey) cb.getTag();
                    _key.setKeySelected(cb.isChecked());

                    // how to get handle of inversion checkbox to enable/disable it
                }
            });

4 个答案:

答案 0 :(得分:1)

假设您有两个名为checkBoxFirst和checkBoxSecond的复选框。

checkBoxFirst.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                checkBoxSecond.setEnabled(isChecked);
            }
        });

希望它会对你有所帮助:)。

答案 1 :(得分:0)

试试这个

 //initialize the second checkbox and set enabled to false 
 holder.inversion.setEnabled(false);

  // set checkchanged listener to your first checkbox
    holder.key.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked){
               //enable if the first checkbox is checked/ticked
                holder.inversion.setEnabled(true);
            }
        }
    });

答案 2 :(得分:0)

使用以下命令更改getView方法:

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

    if (convertView == null) {
        LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.key_info, null);


        holder = new ViewHolder();
        holder.code = (TextView) convertView.findViewById(R.id.keycode);
        holder.key = (CheckBox) convertView.findViewById(R.id.checkBox1);
        holder.inversion = (CheckBox) convertView.findViewById(R.id.checkBox2);

        // set initial status of checkbox inversion
        holder.inversion.setEnabled(cb.isChecked());
        // get final reference, used in onclick listener
        final CheckBox other=holder.inversion;

        convertView.setTag(holder);

        holder.key.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                CheckBox cb = (CheckBox) v;
                DiatonicMajorKey _key = (DiatonicMajorKey) cb.getTag();
                _key.setKeySelected(cb.isChecked());

                // handle of inversion checkbox to enable/disable it
                other.setEnabled(cb.isChecked());
            }
        });
    }
}

我只是为第二个复选框添加初始化代码,我在监听器中使用最终引用来管理复选框状态。

答案 3 :(得分:0)

好的,明白了:

            final CheckBox other=holder.inversion;

            convertView.setTag(holder);

            holder.inversion.setEnabled(false);

            // set checkchanged listener to your first checkbox
            holder.key.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(isChecked){
                        //enable if the first checkbox is checked/ticked
                        other.setEnabled(true);
                    }
                }
            });


            holder.key.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    CheckBox cb = (CheckBox) v;
                    DiatonicMajorKey _key = (DiatonicMajorKey) cb.getTag();
                    _key.setKeySelected(cb.isChecked());

                    // handle of inversion checkbox to enable/disable it
                    other.setEnabled(cb.isChecked());
                    other.setChecked(false);
                }
            });

感谢您的帮助!

相关问题