web-dev-qa-db-ja.com

imagebuttonでリストビューの行をクリックできない

リストビューに問題があります。そのアイテム(行)には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" /> 
56
yital9

残念ながら、

Android:focusable="false"
Android:focusableInTouchMode="false"

ImageButtonでは機能しません。

私は最終的に解決策を見つけました こちら 。それらのアイテムのレイアウトxmlに、以下を追加します

Android:descendantFocusability="blocksDescendants" 

ルートビューに。

ListViewsを持つImageButtonに対して完全に機能します。 公式リファレンス によれば、blocksDescendantsは、ViewGroupがその子孫がフォーカスを受け取るのをブロックすることを意味します。

178
Eliko

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 を参照してください。

7
Angelo

ListViewの行にButtonなどのクリック可能な要素がある場合、Image .. etc..then onItemClickは機能しません。したがって、クリックリスナをリストアダプタのgetViewに記述する必要があります。

詳しくは this をご覧ください。

6
Mohsin Naeem

ボタンにこれらのプロパティを設定します。

      Android:focusable="false"
      Android:focusableInTouchMode="false"

または、アダプタクラスで動的に設定できます。

        yourButton.setFocusable(false);
    yourButton.setFocusableInTouchMode(false);

そして、リストビューの選択モードを単一に設定してください:

       listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
2
Yogesh Somani

私の場合、 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;
2
Giurgiu Ovidiu

行に複数のクリック可能な要素がある場合、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;
    }
1
Maarten

上記の単一の答えは私にとってはうまくいきませんでしたが、組み合わせはうまくいきました。

リストビューに_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)を設定します。

0
SteelBytes