source

OnItemClickListener가 목록 보기에서 작동하지 않음

ittop 2023. 8. 10. 21:25
반응형

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 2개를 사용하는 데 문제가 있습니까?

저는 방금 여기서 해결책을 찾았지만, 딥클릭으로 해결했습니다.

목록의 행 항목에 포커스 가능한 보기 또는 클릭 가능한 보기가 있는 경우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 중 하나를 게시해 주세요.

내 목록에서 행에는 단추와 같이 클릭할 수 있는 다른 항목이 있으므로 블랭킷 블록을 수행하면 하위 항목이 작동하지 않습니다.대신 버튼의 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>

목록 보기의 사용자 지정 행 레이아웃에서 아래 코드 내부 버튼 태그 사용

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

저도 같은 문제가 있었는데 제가 실수로 설정한 것을 발견했습니다.

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

CustomListViewAdapter 클래스에 있습니다.

다음으로 변경:

return true;

저는 그 문제를 가까스로 해결했습니다.만약 누군가가 같은 실수를 했다면...

Android 사용: 하위 포커스 기능

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

2.list_items.xml의 선형 레이아웃의 하위 보기

 android:focusable="false" 

행 보기에서만 클릭하거나 선택할 수 있는 텍스트 보기, 단추 또는 stg가 있는 경우

android:descendantFocusability="blocksDescendants"

충분하지 않습니다.설정해야 합니다.

android:textIsSelectable="false"

텍스트 보기 및

android:focusable="false"

단추 및 기타 포커스 가능한 항목으로 이동합니다.

나도 같은 문제를 겪고 있었는데, 확인란이 있고, 항목을 마스크하기 위해 다음을 수행했습니다. Click Listener 작업.

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

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

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

자세한 예는 링크를 통해 확인할 수 있습니다.

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

그것이 치어스에게 도움이 되길 바랍니다!

저도 같은 문제를 겪었고 언급된 모든 해결책을 시도했지만 소용이 없었습니다.테스트를 통해 저는 텍스트를 선택 가능하게 만드는 것이 청취자가 호출되는 것을 방해한다는 것을 발견했습니다.그래서 거짓으로 바꾸거나 제거함으로써 제 청취자가 다시 호출되었습니다.

android:textIsSelectable="false"

이것이 나처럼 꼼짝 못했던 누군가에게 도움이 되기를 바랍니다.

  1. 기본 레이아웃에 추가

    android:descendantFocusability="blocksDescendants"
    
  2. 이 코드를 모든 버튼에 입력합니다.클릭한 텍스트 보기, 이미지 보기 등

    android:focusable="false"
    
    android:clickable="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(거짓);

@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 레이아웃에서 속성을 설정하는 것과 동일한 기능을 하지만 제 경우에만 작동합니다.

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

저는 위의 모든 것을 시도했지만 아무 것도 되지 않았습니다.

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

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

    });

저도 같은 문제가 있었습니다. 저는 행 레이아웃에서 "초점 가능" 속성을 가진 텍스트 스타일을 사용하고 있었습니다.제가 제거한 후에 작동했습니다.

저의 경우, 저는 다음 줄을 제거해야 했습니다.Layout

android:clickable="true"

Android:autoText 속성을 사용하면 TextView를 자동 포커스할 수 있습니다.

단순 클릭과 긴 클릭 목록 보기 항목을 모두 사용하려면 상황에 맞는 메뉴를 사용하는 것이 더 나은 구현 방법입니다.특히 목록 보기에 여러 행 레이아웃이 있는 경우 setItemLongClickListener를 사용하지 마십시오.

같은 문제에 직면했고, 몇 시간 동안 시도했습니다.위의 모든 것을 시도한 경우 Listview 및 list 항목의 layout_width를 lap_content에서 match_parent로 변경해 보십시오.

위의 모든 것이 저에게 실패했습니다.하지만, 저는 문제를 해결할 수 있었습니다(여러 시간 동안 머리를 부딪힌 후 - 구글, 듣고 있다면, 가능하다면 아래에서 제가 마주친 것을 컴파일러 오류의 형태로 수정하는 것을 고려해주세요).

여기서 xml 레이아웃에 어떤 안드로이드 속성을 추가하는지 주의해야 합니다(이 원래 질문에서는 list_items.xml이라고 합니다).문제의 원인은 EditText 뷰에서 TextView로 전환하고 변경된 속성(inputType)이 남아 있다는 것입니다.내가 앱을 실행하러 갔을 때 컴파일러는 그것을 잡지 못했고 클릭 가능성은 실패했습니다.레이아웃 xml 노드에 있는 모든 속성을 다시 확인합니다.

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()사용합니다.

githubits에서 복사한 것이 나에게 효과가 있었습니다.

제가 할 수 있었던 일은 제 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
            }

        });

여기서 답을 얻었어요!

onClick에서도 동일한 문제가 발생했습니다.해결책은 xml에서 다음을 제거하는 것이었습니다.

android:tooltipText=""

목록에서 클릭 가능한 보기를 제거하여 문제를 해결했습니다.

언급URL : https://stackoverflow.com/questions/5551042/onitemclicklistener-not-working-in-listview

반응형