2012-07-11 2 views
52

私はlistviewに問題があります。その項目(行)にはimageボタンがあります。 imagebuttonには "android:onClick"がありますので、このonclickイベントは機能していますが、行をクリックしても動作しません。行項目からimagebuttonを削除した場合は、行作業(listviewには正しいonclick listnerがあります)をクリックします。どうすれば修正できますか? IMAGEBUTTONとスタンダールのクリックイベント、ユーザーの選択行のユーザークリック(行をIMAGEBUTTONをクリックしますが、クリックしない)とき、私はonclickのイベントを必要とするイメージビューでリストビュー行をクリックできません

私のリストビュー:

<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" /> 

答えて

170

残念ながら、

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

ImageButtonのために動作しません。

最後に解決策が見つかったhere。これらのアイテムのレイアウトxmlには、ルートビューに

android:descendantFocusability="blocksDescendants" 

を追加してください。

ListViewの場合は、ImageButtonが完璧に機能します。 official referenceによれば、blocksDescendantsは、その子孫がフォーカスを受け取るのをブロックすることを意味する。

+9

'ToggleButton'では' android:focusable = "false" 'で十分ですが、ImageButtonでは' android:descendantFocusability = "blocksDescendants"が機能します。 –

+0

私はこのコードを私のリストアイテムのルートビューに追加しました。リストビューとImageButtonを問題なくクリックすることができます。ありがとう –

6

リストビューの列は、任意のクリック可能なお持ちの場合ButtonImageなど.etc.then onItemClickのような要素は機能しません。したがって、あなたのリストアダプターのgetViewにクリックリスナーを書く必要があります。

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

8

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

+0

この解決方法では、行自体が選択されないように注意してください。場合によっては、行を選択して行内のボタンをクリックできるリストビューが必要な場合があります。 – AndroidDev

+0

要求されたビューごとに新しいリスナーを作成することは望ましいですか? – Maarten

+0

@Maartenあなたが効率的であることを意味するならば、 'ViewHolder'テクニックを使うと効率的です。' ListView'はmemmoryに必要な行だけを格納し、すべての行は格納しません。 – Angelo

2

は、あなたのボタンのこれらのプロパティを設定します。

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

またはあなたのアダプタクラスで動的に設定することができます。

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

そして、あなたは、リストビューのためのシングルとして選択モードを設定していることを確認してください:

 listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
+0

これは動作しません。あなたはそれを確認しましたか? – z5h

+0

それは私のために働いた、なぜそれは動作していないと言うのですか?私は、チェックボックス、別のものとボタンで行があります。行を選択することができ、ボタンとチェックボックスも選択できます。 – David

+0

しかし、android:focusable = "false"はImageButtonでは機能しません。 – Eliko

1

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

 @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

私のケースでは、メインレイヤーのandroid:descendantFocusability="blocksDescendants"は動作しませんでした。どちらもListViewでは動作しませんでした。私もButton3のために働いていると聞いた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; 
+0

私は自分のImageButtonを使用しています。それ以外の答えは私のために働いたが、これはうまくいく。 (私はそれらを私のカスタムアダプターで使用しました) – Sdghasemi

0

私のために上記の1つの答えは機能しませんでしたが、組み合わせました。

私は今、私はまたImageButtons上のListViewコントロールとfocusable(false), focusableInTouchMode(false), clickable(true)descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)を設定して、JavaでXML でImageButtons上のListViewコントロールとandroid:focusable="false" android:focusableInTouchMode="false"android:descendantFocusability="blocksDescendants"を設定します。

関連する問題