57

に問題がありListViewます。その項目 (行) にはImageButton. ImageButtonが設定されandroid:onClickているため、このonClickイベントは機能していますが、行をクリックしても機能しません。

行項目からを削除するとImageButton、行の動作をクリックします (ListView正しいonClickリスナーがあります)。どうすれば修正できますか?onClickユーザーが をクリックしたImageButtonときのイベントと、ユーザーが行を選択したときの標準のクリック イベントが必要です ( をクリックするのではなく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" /> 
4

7 に答える 7

180

不運にも、

android:focusable="false"
android:focusableInTouchMode="false"

には機能しませんImageButton

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

android:descendantFocusability="blocksDescendants" 

ルートビューに。

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

于 2013-07-23T06:49:26.237 に答える
7

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);
}

カスタムアダプタの作成についてサポートが必要な場合は、こちらをご覧ください。

于 2012-07-11T08:20:27.300 に答える
6

listView の行に などのクリック可能な要素がある場合ButtonImage機能しonItemClickません。getViewそのため、リスト アダプターにクリック リスナーを記述する必要があります。

詳細については、これをお読みください。

于 2012-07-11T08:17:02.103 に答える
2

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

      android:focusable="false"
      android:focusableInTouchMode="false"

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

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

また、リストビューの選択モードを単一に設定していることを確認してください。

       listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
于 2012-07-11T08:23:01.753 に答える
2

私の場合、android:descendantFocusability="blocksDescendants"メインレイヤーはListViewでも機能しませんでした。android:focusable="false" android:focusableInTouchMode="false"ボタンで機能していると聞いたのも試してみましたが、ImageButtonがあったので機能しませんでした。

ただし、レイアウトの CS ファイルでボタンのプロパティを設定すると機能しました。

var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;
于 2015-05-05T15:13:55.547 に答える
1

行に複数のクリック可能な要素がある場合、onItemClick() は機能しません。OnClickListenerメソッドでを設定する必要がありますgetView()。リスナーをビューのタグに保存してリサイクルできるようにし、リスナーにメソッドを追加して、さまざまな行に特化できるようにします。

        @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;
    }
于 2013-07-04T10:26:26.500 に答える
0

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

ここandroid:descendantFocusability="blocksDescendants"で、ListView とandroid:focusable="false" android:focusableInTouchMode="false"XML の ImageButtons を設定し、Java でもdescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)ListView とfocusable(false), focusableInTouchMode(false), clickable(true)ImageButtons を設定しました。

于 2015-05-13T08:29:36.773 に答える