목록보기에서 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 단계를 수행해야합니다.
- 루트 레이아웃을 다음과 같이 설정하십시오.
android:descendantFocusability="blocksDescendants"
- 이 항목에서 포커스 가능하거나 클릭 가능한보기를 설정하십시오.
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 레이아웃에서 속성을 설정하는 것과 동일한 작업을 수행하지만 제 경우에는 효과가 있습니다.
완벽한 타이밍은 아니지만 누군가에게 도움이 될 것입니다.
이것을 메인 레이아웃에 추가하십시오
android:descendantFocusability="blocksDescendants"
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
'Programing' 카테고리의 다른 글
URL에서 YouTube 비디오 ID를 어떻게 얻습니까? (0) | 2020.04.16 |
---|---|
두 개의 java.util.Date를 비교하여 같은 날인지 확인하십시오. (0) | 2020.04.16 |
OOP vs 함수형 프로그래밍 vs 절차 적 (0) | 2020.04.16 |
Django-render (), render_to_response ()와 direct_to_template ()의 차이점은 무엇입니까? (0) | 2020.04.16 |
정렬 된 배열을 정렬되지 않은 배열보다 느리게 처리하는 이유는 무엇입니까? (0) | 2020.04.16 |