web-dev-qa-db-ja.com

OnItemClickListenerは、ボタンを含むListViewアイテムでは機能しません

ListViewAdapterをこの方法で供給するカスタムViewを備えたListViewがあります。

_   public View getView(int position, View convertView, ViewGroup parent)
   {
        RelativeLayout.LayoutParams lineParams;
        RelativeLayout line=new RelativeLayout(context);

        TextView tv=new TextView(context);
        tv.setText("Text in postion="+i);
        lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        lineParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        line.addView(tv, lineParams);
        lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);

        //checkbox
        CheckBox checkBox=new CheckBox(context);
        lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        lineParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        line.addView(checkBox, lineParams);
        return line;
    }
_

そしてListViewの中のどこかにsetOnItemClickListener()があり、アイテムのクリックイベントをインターセプトする必要があります。私の問題は、チェックボックスをアイテムに追加しようとするたびに、ListViewから応答を得られないことです。 CheckBoxまたは他のButtonをスキップすると動作します。

私は本当にこの問題に固執しています、私はあらゆる種類のレイアウト、整列、折り返しなどを試しました-役に立たない。 CheckBoxListViewのアイテムクリックイベントに干渉するようです。

克服する方法はありますか?

31
barmaley

listView自体ではなく、この行をアイテムビューに追加するだけです

Android:focusable="false"

詳細については、 Androidカスタムリストビューでアイテムをクリックできません から詳細を確認してください。

52
Pratik

リストアイテム内にImageButtonsがある場合、以下を追加する必要があります。

Android:descendantFocusability="blocksDescendants"

ルートリストアイテム要素[ルートレイアウトなど].

次に、リストアイテムの各ImageButton内に、以下を追加する必要があります。

Android:focusableInTouchMode="true"

これでうまくいきましたが、標準のボタンではなく、ImageButtonを使用していました。

17
dandev91

また、設定しようとしたのと同じ問題に直面しましたAndroid:focusable="false"リストビューに機能しますが、機能しません。これをリストビューアイテムに追加します。リストビューアイテムのように、問題を発生させていたトグルボタンを使用したように、Android:focusable="false"トグルボタンとアイテムクリックリスナーのリストビューへの作業の再開

13
Jaiprakash Soni

ListViewに次の行を追加します

Android:choiceMode="singleChoice"

または、レイアウトテキストフィールドに次の行を設定してください

Android:focusable="false"
Android:focusableInTouchMode="false"
Android:clickable="false"
1
GameBug

OnTouchEventをリストビュー項目に記述し、適切なtouchEventを子ビューであるボタンに送信することを検討できます。

0
Lion

ListViewのボタンの問題もありました。残念ながら、アダプターのすべてのオブジェクトのフォーカスをfalseに設定するだけではうまくいきませんでした。

現在、回避策があります。

アダプタで、ボタン(またはその他のクリック可能なオブジェクト)のOnClickListenerをまだ作成していない場合は作成します。そのOnClickListenerで、OnItemClickListenerを自分で呼び出します。

public void onClick(View v) {
    mOnItemClickListener.setOnItemClick(mListView, v, vPos, vId);
}

つまり、アダプターに親のListViewとOnItemClickListenerの両方へのアクセスを許可する必要があります。

0

上記のソリューションがどれも機能しないことはわかっていますが、xml属性を変更しようとしましたが、うまくいきませんでしたが、新しい方法で実装しました。方法は次のとおりです。

interfaceCheckBoxOnCheckListenerをメソッドonCheckBoxCheckedで作成し、必要なパラメーターを渡し、listViewを含むアクティビティまたはfragmentにインターフェイスCheckBoxOnCheckListenerを実装します。

次に、アダプターでmListenerCheckBoxOnCheckListenerとして宣言し、これをパラメーターとしてfragment/activityからアダプターのコンストラクターに渡し、CheckBoxOnCheckListenerにキャストしてmListenerに割り当てます。

次に、mListeneritemView.onClickまたはCheckBox.onCheckCheckedListenerおよびonCheckChangedメソッド呼び出しmListener.onCheckBoxCheckedとして設定します。

それでおしまい。それは間違いなく動作します、それは私のために働いた。コードは午後だけです。

0
Amit