Programing

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

lottogame 2020. 4. 16. 08:13
반응형

목록보기에서 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);
    }
}

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


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

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

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

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

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


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

android:focusable="false"

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


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>

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

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

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

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

내 CustomListViewAdapter 클래스에서.

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

return true;

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


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

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


이 답변 의 도움으로 해결했습니다.

1. list_items.xml의 선형 레이아웃에 다음을 추가하십시오. android:descendantFocusability="blocksDescendants"

list_items.xml에서 LinearLayout의 자식 뷰

 android:focusable="false" 

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

android:descendantFocusability="blocksDescendants"

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

android:textIsSelectable="false"

당신의 텍스트 뷰에

android:focusable="false"

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


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

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

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

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

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

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

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


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

android:textIsSelectable="false"

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


두 가지 멋진 솔루션은 조각에서 확장 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);
} 

제 경우에는 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. 이것을 메인 레이아웃에 추가하십시오

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

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

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


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

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

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

    });

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


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


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


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

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


Android : autoText 속성은 TextView 자동 포커스 기능도 만듭니다.


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 에서 복사하여 나를 위해 일했습니다.


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

        });

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

참고 URL : https://stackoverflow.com/questions/5551042/onitemclicklistener-not-working-in-listview

반응형