0

を使用して Android アプリケーションを開発していListViewます。この中のすべてのアイテムにListViewcheckbox.

ユーザーがいずれかをクリックすると、すべての項目のチェックを外そうとしています。たとえば、ListView2 つの項目0, 1を持つ a 。

この時点で 0 が選択され、ユーザーはアイテム 1 をタップします。アイテム 0 の選択を解除したいです。

これは私のコードです。の中にありArrayAdapterます。

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    View row = convertView;
    if (row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(itemLayoutId, parent, false);
    }

    Gate gate = gates.get(position);
    if (gate != null)
    {
        TextView itemText = (TextView)row.findViewById(R.id.gateNameText);
        if (itemText != null)
            itemText.setText(gate.getName());

        ImageView imageView = 
                (ImageView)row.findViewById(R.id.gateTypeImage);
        int resId;

        switch (gate.getSelTypeOperation())
        {
            case 0:
                resId = R.drawable.garage;
                break;
            case 1:
                resId = R.drawable.pulse;
                break;
            case 2:
                resId = R.drawable.onoff;
                break;
            default:
                resId = R.drawable.garage;
                break;
        }
        imageView.setImageResource(resId);

        CheckBox checkBox = 
                (CheckBox)row.findViewById(R.id.gateSelectedCheck);
        if (checkBox != null)
        {
            checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
            {
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked)
                {
                    // Solo hago algo si el nuevo estado es marcado.
                    if (isChecked)
                        for(int i = 0; i < gates.size(); i++)
                        {
                            if (i != position)
                            {
                                Log.v("GatesAdapter", "uncheck: " + position);
                                View view = getView(i, null, null);
                                CheckBox checkBox = 
                                        (CheckBox)view.findViewById(R.id.gateSelectedCheck);
                                checkBox.setChecked(false);
                            }
                        }
                }
            });
            checkBox.setChecked(selectedGateIndex == position);
        }
    }

    return row;
}

しかし、うまくいきません。

私は何を間違っていますか?

4

4 に答える 4

1

getview()以下に示すように、メソッドを変更するだけです。

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        final Holder holder;
        if (vi == null) {
            vi = inflater.inflate(R.layout.raw_customelabel_list, null);
            holder = new Holder();

            holder.txtname = (TextView) vi
                    .findViewById(R.id.raw_customlabel_txt_name);
            holder.checkbox = (CheckBox) vi
                    .findViewById(R.id.raw_customlabel_checkbox);
            vi.setTag(holder);

        } else {
            holder = (Holder) vi.getTag();
        }

        vi.setTag(holder);
        holder.txtname.setText(strarry[position]);

        holder.checkbox.setId(position);
        holder.checkbox.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i = 0; i < strarry.length; i++) {
                    if (v.getId() == i) {
                        checkarry[i] = true;
                        Log.v("check", ""+position);
                    } else {
                        checkarry[i] = false;
                    }
                }
                notifyDataSetChanged();
            }
        });

        if (checkarry[position]) {
            holder.checkbox.setChecked(true);
        } else {
            holder.checkbox.setChecked(false);
        }

        return vi;
    }

}
于 2012-09-29T12:38:36.280 に答える
1

以下のコードを使用すると、問題なく動作します

int selected_position =-1
public View getView(final int position, View convertView, ViewGroup parent)
{


if(selected_position==position)
        {
            CHECKBOX.setChecked(true);

        }
        else
        {
            CHECKBOX.setChecked(false);

        }

            CHECKBOX.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {



                    if (((CheckBox) view).isChecked())
                    {
                        selected_position= position;

                    }
                    else
                    {
                        selected_position=-1;
                    }


                    notifyDataSetChanged();


                }
            });
      return view;
    }

}
于 2015-01-16T11:24:52.827 に答える
1

listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE) を使用する必要があり、カスタムビューの行をチェック可能にする必要があります。. 別のSOの質問はすでにあります-solnはこちら

于 2012-07-19T11:47:49.913 に答える
0

ラジオボタンを使用します。チェックボックスが表示されたら、いくつでも選択できると思います。

コード内で CheckBox オブジェクトを RadioButton に置き換えるだけでは、問題は解決しませんか?

于 2012-07-19T12:50:59.613 に答える