목록보기에서 OnItemCLickListener가 작동하지 않습니다.


243

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

팽창하는 동안 두 개의 XML을 사용하는 데 문제가 있습니까?


4
@hiei 내 문제는 레이아웃 셀에서 이미지 버튼을 사용하고 있다는 것입니다. "android : descendantFocusability"를 추가 한 후에도 클릭 리스너가 응답하지 않았습니다. 내가 한 것은 모든 ImaegButton을 ImageViews로 변경 한 것입니다. 내 문제가 해결되었습니다.
Ajith Memana

답변:


731

방금 여기에서 해결책을 찾았지만 깊은 클릭으로.

목록의 행 항목에 포커스 가능하거나 클릭 가능한보기가 포함되어 있으면 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>

나를 위해 작동하지 않습니다. 누구나 볼 수 있습니까 [ stackoverflow.com/questions/21692209/…
suitianshi

3
당신은 또한에 프로그래밍 방식이 설정할 수 있습니다 listView.setDescendantFocusability(int focus);focus중 하나입니다 ViewGroup.FOCUS_BEFORE_DESCENDANTS, ViewGroup.FOCUS_AFTER_DESCENDANTS또는ViewGroup.FOCUS_BLOCK_DESCENDANTS
최대 늑대에게

댓글 20 개가 고맙다는 점이 재미 있다고 생각합니다. 지난 8 시간 동안이 문제에 부딪 쳤으므로이 점에 감사드립니다.
sparticvs

1
내 질문은 이것이 안드로이드 버그입니까, 아니면 디자인입니까?
fangzhzh

나는 지금 6 시간 동안이 문제에 갇혀 있었고 정말로 도움이 필요하다. stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
Ruchir Baronia

89

문제는 레이아웃에 포커스 가능하거나 클릭 가능한 항목이 포함되어 있다는 것입니다. 뷰에 포커스 가능하거나 클릭 가능한 항목이 포함되어 있으면 OnItemCLickListener가 호출되지 않습니다.

자세한 내용은 여기 를 클릭 하십시오 .

그렇지 않은 경우 레이아웃 xml 중 하나를 게시하십시오.


2
이것은 나를위한 해결책이었습니다. 클릭 가능한 것으로 내 견해를 선언했습니다. 감사!
kingraam

1
감사! 내 2 EditText초를 TextViews로 변경 CheckBox했으며 내에 android:descendantFocusability="blocksDescendants"추가 된 상태로 유지하고 전환 할 수있게했습니다 LinearLayout.
Azurespot 2016 년

예! 나는 android:focusableInTouchMode="true"행을 가지고 있었고 , 일단 제거되면 마침내 작동하기 시작했습니다! :-)
SharpC

58

내 목록의 경우 내 행에는 버튼과 같이 클릭 할 수있는 다른 항목이 있으므로 담요를 blocksDescendants수행해도 작동하지 않습니다. 대신 버튼의 XML에 줄을 추가했습니다.

android:focusable="false"

이렇게하면 버튼이 행의 클릭을 차단하지 못하지만 여전히 버튼을 클릭 할 수 있습니다.


@ user1840899 이것은 일반적인 답변이며 내가 배운 것이므로 전달했습니다. 올바른 정보이며 다운 투표 할 가치가 없습니다.
Janene Pappas

이것은 ListView 항목의 CheckBox에서 작동합니다 (blocksDescendants 제외)
thpitsch

이 수정 버그 (나를 위해 ToggleButton을을) 버튼을 유지하면서 클릭
모흐센 아프신

RadioButtons가있는 GridView를 얻을 수있는 유일한 방법은 RadioButton을 포함하는 LinearLayout에 android : descendantFocusability = "blocksDescendants"를 적용하고 RadioButton 자체에서 android : clickable = "false"를 설정하는 것입니다.
Stephen McCormick

나는 지금 6 시간 동안이 문제에 갇혀 있었고 정말로 도움이 필요하다. stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
Ruchir Baronia

34

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>

clickable="true항목보기에서 설정하면 onItemClick이 호출되지 않습니다. 따라서 clickable="false"항목 루트보기를 추가 하는 데주의하십시오 .이 경우LinearLayout
vovahost

android : descendantFocusability = "blocksDescendants"를 설정하면 도움이됩니다. 감사!
LLIAJLbHOu

12/21/16, 몇 시간 동안 검색 한 후이 작업을 수행했습니다. 감사합니다.
Tanner Summers

가로와 같은 레이아웃을 사용하는 경우에도 가로로 배치해야합니다.
Immy

19

listview의 사용자 정의 행 레이아웃에서 버튼 태그 안에 아래 코드를 사용하십시오.

 android:focusable="false"
 android:clickable="false"

위대한 사람은 정말 도움이되었습니다!
divyansh ingle

이것은 여기에서 일했다!! 이보기에 많은 확인란이 있으며 클릭에 대해이 확인란을 사용 android:descendantFocusability="blocksDescendants"하여 차단합니다.
Armando Marques Sobrinho

17

나는 같은 문제가 있었고 실수로 실수로 설정 한 것을 보았습니다.

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

내 CustomListViewAdapter 클래스에서.

이것을 다음과 같이 변경하면 :

return true;

문제를 해결했습니다. 누군가가 같은 실수를 저지른 경우를 대비하여 ...


7
나도@Override public void onApplicationStart { ExplodeThisDevice(); }
Léon Pelletier

17

사용 안드로이드 : 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" >

루트 레이아웃에서 위의 추가


2
세부 정보를 추가하면 더 나은 답변이되고 +1이 될 수 있습니다.
Killer

이것은 나를 위해 일했고 목록 요소의 내 버튼은 여전히 ​​의도 한대로 작동했습니다.
구스타프 에릭손


10

행보기에서만 텍스트 뷰, 버튼 또는 stg를 클릭하거나 선택할 수있는 경우

android:descendantFocusability="blocksDescendants"

충분하지 않다. 당신은 설정해야

android:textIsSelectable="false"

당신의 텍스트 뷰에

android:focusable="false"

버튼 및 기타 초점을 맞출 수있는 항목에


나는 이것을 어려운 방법으로 배웠다. android : textIsSelectable = "false"
다음에주의

10

같은 문제가 있었지만 확인란이 있습니다. 항목 클릭 리스너 작동을 위해 다음을 수행하십시오.

확인란에 다음 속성을 추가했습니다.

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

ItemClickListner가 작동하기 시작했습니다.

자세한 예를 보려면 링크를 통해 이동할 수 있습니다.

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

그것이 건배에 도움이되기를 바랍니다!


5

나는 같은 문제가 있었고 언급 한 모든 해결책을 시도했지만 아무 소용이 없었다. 테스트를 통해 텍스트를 선택 가능하게 만들면 리스너가 호출되지 않는 것으로 나타났습니다. 따라서 false로 전환하거나 제거하여 내 리스너를 다시 호출했습니다.

android:textIsSelectable="false"

이것이 나처럼 붙어있는 누군가를 돕기를 바랍니다.


4
  1. 이것을 메인 레이아웃에 추가하십시오

    android:descendantFocusability="blocksDescendants"
  2. onClick이있는 모든 버튼, Textview, ImageView 등에이 코드를 작성하십시오.

    android:focusable="false"
    
    android:clickable="false"

그것이 효과가 있기를 바랍니다.


3

두 가지 멋진 솔루션은 조각에서 확장 ListFragment가 mListView.setOnItemClickListener활동을 만들기 전에 호출되지 않는다는 것을 알고 있으면 활동이 생성 될 때 설정되도록하는 것입니다.

@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

제 경우에는 xml 레이아웃 속성이 도움이되지 않았습니다.

다음과 같이 한 줄의 코드를 추가하면됩니다. 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 레이아웃에서 속성을 설정하는 것과 동일한 작업을 수행하지만 제 경우에는 효과가 있습니다.

완벽한 타이밍은 아니지만 누군가에게 도움이 될 것입니다.


1

위의 모든 것을 시도했지만 아무것도 작동하지 않았습니다.

다음과 같이 문제를 해결했습니다.

먼저이라는 사용자 정의 버튼을 정의합니다. 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

같은 문제가 있었는데, "focusable"속성이있는 행 레이아웃에서 텍스트 스타일을 사용하고있었습니다. 그것을 제거한 후에 작동했습니다.


1

내 경우에는 다음 행을 제거해야했습니다. Layout

android:clickable="true"


0

간단한 클릭과 긴 클릭 목록보기 항목을 모두 사용하려면 더 긴 방법으로 컨텍스트 메뉴를 사용하는 것이 좋습니다. 목록보기에 여러 행 레이아웃이있는 경우 특히 setItemLongClickListener를 사용하지 마십시오.


0

같은 문제에 직면하여 몇 시간 동안 시도했습니다. 위의 모든 것을 시도한 경우 wview_content에서 listview 및 list item의 layout_width를 match_parent로 변경하십시오.


0

위의 모든 것이 나를 위해 실패했습니다. 그러나 문제를 해결할 수있었습니다 (많은 시간 동안 내 머리를 두드리고 나서-Google, 듣고 있다면 아래에서 발생한 것을 가능한 경우 컴파일러 오류 형식으로 수정하는 것을 고려하십시오)

XML 레이아웃에 어떤 안드로이드 속성을 추가해야하는지 신중히 고려해야합니다 (원래 질문에서는 list_items.xml이라고합니다). 나에게 문제의 원인은 EditText보기에서 TextView로 전환했으며 변경 사항 (내 경우에는 inputType)에서 남은 속성 cruft가 있다는 것입니다. 컴파일러가 그것을 잡지 못했고 앱을 실행하려고 할 때 클릭 가능성이 실패했습니다. 레이아웃 xml 노드에있는 모든 속성을 다시 확인하십시오.


0
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

나를 위해 일한 것은 내 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>

그리고 이것은 내 Fragment 하위 클래스의 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
            }

        });

나는 여기 에서 대답을 얻었다 !


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.