web-dev-qa-db-ja.com

リストビューでOnItemCLickListenerが機能しない

Activityクラスコード:

conversationList = (ListView)findViewById(Android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new  ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        Log.d("test","clicked");
    }
});

getViewクラスのAdapter関数:

if (v == null) {                                
    LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if(leftSideMessageNumber.equals(m.getTo())) {
        v = vi.inflate(R.layout.conversation_list_item_format_left, null);
    } else {
        v = vi.inflate(R.layout.conversation_list_item_format_right, null);
    }
}

膨張中に2つのxmlを使用することに問題はありますか?

227
hiei

私はここから解決策を見つけました..しかし、深いクリックで...

リストの行項目にフォーカス可能なビューまたはクリック可能なビューが含まれている場合、OnItemClickListenerは機能しません。

行項目には、Android:descendantFocusability="blocksDescendants"のようなパラメーターが必要です。

ここでは、リストアイテムがどのように見えるか、例を見ることができます。リストアイテムxmlは... row_item.xml(your_xml_file.xml)である必要があります

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:baselineAligned="false"
Android:descendantFocusability="blocksDescendants"
Android:gravity="center_vertical" >

// your other widgets here

</LinearLayout>
708
Bhavesh Hirpara

問題は、レイアウトにフォーカス可能なアイテムまたはクリック可能なアイテムが含まれていることです。ビューにフォーカス可能なアイテムまたはクリック可能なアイテムが含まれている場合、OnItemCLickListenerは呼び出されません。

詳細については、 here をクリックしてください。

そうでない場合は、レイアウトxmlのいずれかを投稿してください。

87
balazsbalazs

リストの場合、行にはボタンなどの他のクリックできるものがあるため、ブランケットブロックを実行しても子孫は機能しません。代わりに、ボタンのxmlに行を追加します。

    Android:focusable="false"

これにより、ボタンが行のクリックをブロックするのを防ぎますが、それでもボタンがクリックすることを許可します。

57
Janene Pappas

listview_item.xmlで2つのステップを実行する必要があります

  1. ルートレイアウトを設定する:Android:descendantFocusability="blocksDescendants"
  2. このアイテムでフォーカス可能またはクリック可能なビューを設定するには:
    Android:clickable="false"
    Android:focusable="false"
    Android:focusableInTouchMode="false"

例を次に示します:listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="10dp"
    Android:layout_marginTop="10dp"
    Android:paddingLeft="10dp"
    Android:paddingRight="10dp"
    Android:gravity="center_vertical"
    Android:orientation="vertical"
    Android:descendantFocusability="blocksDescendants">

    <RadioButton
        Android:id="@+id/script_name_radio_btn"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textStyle="bold"
        Android:textColor="#000"
        Android:padding="5dp"
        Android:clickable="false"
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        />

</LinearLayout>
29
Eddy

リストビューのカスタム行レイアウトのボタンタグ内で以下のコードを使用します

 Android:focusable="false"
 Android:clickable="false"
18
Milan Shukla

私は同じ問題を抱えていて、間違って設定したのを見ました:

@Override
public boolean isEnabled(int position)
{
    return false;
}

customListViewAdapterクラスで。

これを次のように変更します。

return true;

私は問題を解決することができました。誰かが同じ間違いをした場合に備えて...

17
Woody

Android:descendantFocusabilityを使用します

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="80dip"
    Android:background="@color/light_green"
    Android:descendantFocusability="blocksDescendants" >

ルートレイアウトに上記を追加

17
Amar Gore

この答え の助けを借りて解決しました

1. list_items.xmlの線形レイアウトに以下を追加しますAndroid:descendantFocusability="blocksDescendants"

2. list_items.xmlのLinearLayoutの子ビュー

 Android:focusable="false" 
11

私も同じ問題を抱えていましたが、チェックボックスを持っています、itemClickListenerが機能しないように以下を行いました、

チェックボックスに次のプロパティを追加しました。

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

そしてItemClickListnerが働き始めました。

詳細な例については、リンクをご覧ください。

http://knowledge-cess.com/Android-itemclicklistner-with-checkbox-or-radiobutton/

応援よろしくお願いします!!

10
Gokul Kulkarni

行ビューでのみクリックまたは選択可能なテキストビュー、ボタン、またはstgがある場合

Android:descendantFocusability="blocksDescendants"

十分ではありません。設定する必要があります

Android:textIsSelectable="false"

あなたのテキストビューに

Android:focusable="false"

ボタンやその他のフォーカス可能なアイテムに。

10
savepopulation

私は同じ問題を抱えていて、言及されたすべての解決策を試してみました。テストを通じて、テキストを選択可能にするとリスナーが呼び出されなくなることがわかりました。そのため、falseに切り替えるか、削除することで、リスナーが再度呼び出されました。

Android:textIsSelectable="false"

これが私のように立ち往生している人を助けることを願っています。

5
u2tall

私の場合、XMLレイアウトプロパティはどれも役に立ちませんでした。

次のようなコードを1行追加するだけです。convertView.setClickable(false);

@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null || convertView.getTag() == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.my_layout_id, parent, false);
        viewHolder = new ViewHolder(convertView);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    ...
    convertView.setClickable(false);
    return convertView;
}

そのため、基本的にはxmlレイアウトでプロパティを設定するのと同じことを行いますが、私の場合はうまくいくだけです。

完璧なタイミングではありませんが、誰かの幸せなコーディングに役立つかもしれません

3
Marek Skóra

これは、フラグメントから拡張ListFragmentがアクティビティを作成する前にmListView.setOnItemClickListenerが呼び出されないことを知っている場合、アクティビティが作成されたときに確実に設定されるという2つの素晴らしいソリューションです。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
            // Do the onItemClick action

            Log.d("ROWSELECT", "" + rowId);
        }
    });
}

ListFragmentのソースコードを見ながら、私はこれに出会いました

public class ListFragment extends Fragment {
    ...........................................
    ................................................

    final private AdapterView.OnItemClickListener mOnClickListener
                = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            onListItemClick((ListView)parent, v, position, id);
        }
    };

    ................................................................
    ................................................................

    public void onListItemClick(ListView l, View v, int position, long id) {
    }
}

onItemClickListenerオブジェクトがアタッチされ、onListItemClick()を呼び出します。同様に動作する他の同様のソリューションは、onListItemClick()をオーバーライドすることです。

@Override
public void onListItemClick(ListView l, View v, int position, long rowId) {
    super.onListItemClick(l, v, position, id);
   // Do the onItemClick action

   Log.d("ROWSELECT", "" + rowId);
} 
3
Rowland Mtetezi
  1. これをメインレイアウトに追加する

    Android:descendantFocusability="blocksDescendants"
    
  2. OnClickがあるすべてのボタン、Textview、ImageViewなどにこのコードを記述します

    Android:focusable="false"
    
    Android:clickable="false"
    

それがうまくいくことを願っています。

2
Wajid khan

私は同じ問題を抱えていました。「フォーカス可能な」属性を持つ行レイアウトのテキストにスタイルを使用していました。私はそれを削除した後に機能しました。

1
Miguel Rdz

上記のすべてを試しましたが、何も機能しませんでした。

次のように問題を解決しました。

最初にListButtonというカスタムボタンを定義します

public class ListButton extends Android.widget.Button
{

private ButtonClickedListener clickListener;

public ListButton(Context context)
{
    this(context, null);
}

public ListButton(Context context, AttributeSet attrs)
{
    this(context, attrs, 0);
}

public ListButton(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
}

public void setClickListener(ButtonClickedListener listener) {
    this.clickListener = listener;
}

@Override
public boolean isInTouchMode() {
    return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    return false;
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    switch (event.getAction()) 
      {
          case MotionEvent.ACTION_DOWN:
              break;
          case MotionEvent.ACTION_UP:

              eventClicked();

              break;
          case MotionEvent.ACTION_CANCEL:
              break;
          case MotionEvent.ACTION_MOVE:
              break;
          default :

      }
    return true;
}

private void eventClicked() {
    if (this.clickListener!=null) {
        this.clickListener.ButtonClicked();
    }
}

}

XMLは次のようになります。

<dk.example.views.ListButton
Android:id="@+id/cancel_button"
Android:layout_width="125dp"
Android:layout_height="80dp"
Android:text="Cancel"
Android:textSize="20sp" 
Android:layout_margin="10dp"
Android:padding="2dp"
Android:background="#000000"
Android:textColor="#ffffff"
Android:textStyle="bold"  
/>

次に、独自のButtonClickedリスナーインターフェイスを定義します。

public interface ButtonClickedListener {
    public void ButtonClicked();
}

次に、通常のOnClickListenerであるかのように、独自のリスナーを使用します。

final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button);

    cancelButton.setClickListener(new ButtonClickedListener() {

        @Override
        public void ButtonClicked() {
            //Do your own stuff here...
        }

    });
1
AndreasReiff

Android:autoText属性は、TextViewを自動フォーカス可能にします。

同じ問題に直面し、何時間も試してみました。上記のすべてを試した場合は、リストビューのレイアウト幅とリスト項目をwrap_contentからmatch_parentに変更してみてください。

0
prashant
private AdapterView.OnItemClickListener onItemClickListener;

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
 .......

final View view = convertView;
convertView.setOnClickListener(new View.OnClickListener() {
    @Override
     public void onClick(View v) {
         if (onItemClickListener != null) {
             onItemClickListener.onItemClick(null, view, position, -1);
         }
      }
 });

return convertView;
}

public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

次に、アクティビティでadapter.setOnItemClickListener()を使用してから、リストビューに添付します。

github からコピーされた

0
Java coder

私のために働いたのは、row.xmlファイルのレイアウト内のすべてのサブビューに以下のコードを追加することでした:

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

だから私の場合:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">


    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:id="@+id/testingId"
        Android:text="Name"
       //other stuff 
        />

    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:id="@+id/dummyId"
        Android:text="icon"
        //other stuff 
        />

    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:id="@+id/assignmentColor"
       //other stuff 
       />

    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:id="@+id/testID"
        //other stuff 
        />

    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:text="TextView"
        //other stuff 
        />

</Android.support.constraint.ConstraintLayout>

そして、これは私のフラグメントサブクラスでの私のsetOnItemClickListener呼び出しです:

CustomListView = (PullToRefreshListCustomView) layout.findViewById(getListResourceID());
        CustomListView.setAdapter(customAdapter);
        CustomListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d("Testing", "onitem click working");
              //  other code
            }

        });

here !から答えを得ました。

0
spcarlin

リストビューアイテムのシンプルクリックとロングクリックの両方を使用する場合は、ロングクリックにコンテキストメニューを使用することを実装するより良い方法です。特にリストビューに複数の行レイアウトがある場合は、setItemLongClickListenerの使用を避けてください。

0
Samuel Robert

上記はすべて失敗しました。しかし、私は問題を解決することができました(頭を叩いて何時間も後-Google、聞いているなら、可能であればコンパイラエラーの形で私が遭遇したものを修正することを検討してください)

ここでxmlレイアウトに追加するAndroid属性に注意する必要があります(この元の質問では、list_items.xmlと呼ばれます)。私にとって問題の原因は、EditTextビューからTextViewに切り替えて、変更による残りの属性が残っていることです(私の場合はinputType)。コンパイラはそれをキャッチせず、アプリを実行しようとしたときにクリック可能性が失敗しました。レイアウトxmlノードにあるすべての属性を再確認します。

0
Ted_Zactly