リストビューに問題があります。そのアイテム(行)にはimagebuttonがあります。 imagebuttonには「Android:onClick」があるため、このonclickイベントは機能していますが、行のクリックは機能しません。行ボタンからimagebuttonを削除すると、行をクリックします(listviewには正しいonclick listnerがあります)。どうすれば修正できますか?ユーザーが行を選択するとき、ユーザーがimagebuttonをクリックし、standartクリックイベントが発生したときにonclickイベントが必要です(imagebuttonをクリックせず、行をクリックします)
私のリストビュー:
<ListView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/restaurants_list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:divider="@color/list_devider"
Android:dividerHeight="1dp"
Android:cacheColorHint="@color/list_background" />
残念ながら、
Android:focusable="false"
Android:focusableInTouchMode="false"
ImageButton
では機能しません。
私は最終的に解決策を見つけました こちら 。それらのアイテムのレイアウトxmlに、以下を追加します
Android:descendantFocusability="blocksDescendants"
ルートビューに。
ListView
sを持つImageButton
に対して完全に機能します。 公式リファレンス によれば、blocksDescendants
は、ViewGroup
がその子孫がフォーカスを受け取るのをブロックすることを意味します。
ListViewにカスタムアダプタを使用できます(まだしていない場合)。そして、アダプターのgetView(int position, View inView, ViewGroup parent)
メソッドで次のようなことを行います。
@Override
public View getView(int position, View inView, ViewGroup parent) {
View v = inView;
ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview
if (v == null) {
LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) v.findViewById(R.id.ImageView);
v.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) v.getTag();
}
.....
viewHolder.image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Click on imageView
}i
});
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Click on listView row
}
});
.....
return (v);
}
カスタムアダプタの作成についてサポートが必要な場合は、 here を参照してください。
ListViewの行にButton
などのクリック可能な要素がある場合、Image
.. etc..then onItemClick
は機能しません。したがって、クリックリスナをリストアダプタのgetView
に記述する必要があります。
詳しくは this をご覧ください。
ボタンにこれらのプロパティを設定します。
Android:focusable="false"
Android:focusableInTouchMode="false"
または、アダプタクラスで動的に設定できます。
yourButton.setFocusable(false);
yourButton.setFocusableInTouchMode(false);
そして、リストビューの選択モードを単一に設定してください:
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
私の場合、 Android:descendantFocusability="blocksDescendants"
メインレイヤーは、ListViewでも機能しませんでした。私も試してみましたAndroid:focusable="false" Android:focusableInTouchMode="false"
Buttonsで機能していると聞いたが、ImageButtonがあったので機能しなかった。
ただし、レイアウトのCSファイルでボタンのプロパティを設定することはできました。
var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;
行に複数のクリック可能な要素がある場合、onItemClick()は機能しません。 getView()
メソッドでOnClickListener
を設定する必要があります。リスナーをリサイクルできるようにビューのタグを保存し、リスナーにメソッドを追加して、異なる行に特化できるようにします。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
RowClickListeners listeners = (RowClickListeners) view.getTag();
if (listeners == null) {
listeners = new RowClickListeners();
}
// Row click listener:
RowClickListener onClickListener = listeners.rowClickListener;
if (onClickListener == null) {
onClickListener = new RowClickListener();
listeners.rowClickListener = onClickListener;
}
onClickListener.setToPosition(pos);
view.setOnClickListener(onClickListener);
// Overflow listener:
View btn = view.findViewById(R.id.ic_row_btn);
ButtonListener btnListener = listeners.buttonClickListener;
if (rowListener == null) {
btnListener = new ButtonListener(activity);
listeners.rowClickListener = btnListener;
}
btnListener.setToPosition(pos);
btnListener.setCollection(collectionId);
btn.setOnClickListener(btnListener);
}
public static class RowClickListeners {
public RowClickListener rowClickListener;
public ButtonListener buttonClickListener;
}
上記の単一の答えは私にとってはうまくいきませんでしたが、組み合わせはうまくいきました。
リストビューに_Android:descendantFocusability="blocksDescendants"
_を、XMLのImageButtonsに_Android:focusable="false" Android:focusableInTouchMode="false"
_を設定します[〜#〜] and [〜#〜] in Java I ListViewでdescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)
を設定し、ImageButtonsでfocusable(false), focusableInTouchMode(false), clickable(true)
を設定します。