4

行項目を動的に追加する ListView があります。各行には子の番号があります。今、私はこれらのチャイルドでクリックリスナーを設定しています。これらの子アイテムを最終的に保持するように求められます.

ここで isFree は最後の checkBox です。

isFree.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
        // TODO Auto-generated method stub
        if (isFree.isChecked()){...}
    }
});

しかし、私はそれを良いプログラミングの実践とは感じていません。どの子がクリックされたかを検出する関数を使用したいので、getParent を使用してその行にアクセスし、次に getChildAt(index) を使用してその兄弟項目にアクセスできるようにする必要があります。これ:

isFree.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
        // TODO Auto-generated method stub
        CheckBox tv=(CheckBox) getCurrentFocus();
        TableRow row = (TableRow)tv.getParent();
        TextView tv1=(TextView) row.getChildAt(5);
        if (tv.isChecked()){...}
    }
});

しかし、私がそれを使用すると、フォーカスされたアイテムは実際にはリストビューを返しますが、行にフォーカスされたアイテムが必要です。

4

2 に答える 2

0

リストビューのどの子がonItemClickListenerでクリックされたかを取得できますが、チェックボックスまたはその他のクリック可能なビューを持つ行で何らかのアクションを実行し、それらのクリックで何らかのアクションを実行したい場合は、クリックを使用する必要があると思いますそれらのビュー自体のリスナー。

ただし、これらの個々のビューのクリックで listitem 行を取得する場合は、ビュー クラスの setTag メソッドを使用してインデックスを保存し、クリック リスナーでそのインデックスから行アイテムを取得できます。

public view getView(int position, View convertView, ..) {
  ....
  ....
  ....
  // your code
  convertView.setTag(position);
  return convertView;
}

isFree.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
        // TODO Auto-generated method stub
        if (arg0.isChecked()){
            int index = arg0.getTag();
            View v = listview.getItemAtPosition(index);
            // or  get the adapter get data list from it and then index it.

        }
    }
});

注意: oncheckedchange メソッド内で final free を使用していません。

于 2013-10-18T07:27:00.847 に答える