10

I have a ListView with checkbox:

  1. Oncheckedchanged(..) is called when user check/uncheck item on listview
  2. OncheckedChanged(..) called again when user click the listitem via onItemClick(.....)

Is this a known issue? how to differentiate the events.

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder viewHolder = null;
if (convertView == null) {
    LayoutInflater inflator = context.getLayoutInflater();
    convertView = inflator.inflate(R.layout.row, null);
    viewHolder = new ViewHolder();
    viewHolder.text = (TextView) convertView.findViewById(R.id.label);
    viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check);
    viewHolder.imageview= (ImageView) convertView.findViewById(R.id.imageView1);
    viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                    list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
                }
            });
    convertView.setTag(viewHolder);
    convertView.setTag(R.id.label, viewHolder.text);
    convertView.setTag(R.id.check, viewHolder.checkbox);
    convertView.setTag(R.id.imageView1, viewHolder.imageview);

} else {
    viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.checkbox.setTag(position); // This line is important.
viewHolder.imageview.setTag(position);
viewHolder.text.setText(list.get(position).getName());
viewHolder.checkbox.setChecked(list.get(position).isSelected());


//        change the default-image here
if(list.get(position).getcontact_id()==5)
{
    viewHolder.imageview.setImageResource(android.R.drawable.ic_dialog_map);
}...
..


 return convertView;
 }

EDIT

onCheckedChanged() is called

  1. Once when no item are selected and user clicks the checkbox
  2. If the list consists of 3 items and when user click on any other items, onItemclick() is invoked and onCheckedChanged() is fired 3 times ( =no: of items in the listview)
4

3 に答える 3

20

onCheckChangeListener を onClickListener に置き換えます。

checkChanged は、setChecked() メソッドを呼び出したときとチェックボックスをクリックしたときに呼び出されるため、2 回呼び出されます。

于 2013-10-07T08:28:42.740 に答える
6

これは予想される動作です。

  • onCheckedChanged(CompoundButton buttonView, boolean isChecked)チェックされている/チェックされていないときはいつでも、すべてのアイテムに対して呼び出されます。Android は、すべてのアイテムのステータスを追跡することを決定し、アイテムが変更されるたびに各アイテムについて電話をかけます。パラメータを使用すると、isChecked何が起こったかを区別できます。

  • onItemClick()アイテムの 1 つがクリックされるたびに呼び出されます - それは必ずしもアイテム内のチェックボックスではなく、どこかです。通常、アイテムは後で選択されますが、常にではありません。

  • リスト ビューから実際に選択された項目を知る必要がある場合は、 を使用しますOnItemSelectedListener.onItemSelected()。これは、選択 (項目全体) を取得するために呼び出されるものです。

ところで:チェックボックスの動作を手動でプログラムする必要はありません。ボックス内のチェックのオン/オフと描画は Android によって行われます。どちらが選択されたかがわかったら、チェック済みのステータスを取得するだけです。したがって、onCheckedChanged私が見る限り、実装はまったく必要ありません。

于 2013-10-07T11:37:53.830 に答える