OnItemCLickListener không hoạt động trong listview


242

Activity mã lớp:

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

Các getViewchức năng trong Adapterlớp:

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

Có vấn đề với việc sử dụng hai xml trong khi bơm hơi?


4
@hiei Vấn đề của tôi là tôi đã sử dụng các nút hình ảnh trong các ô bố trí của mình. Ngay cả sau khi thêm "android: descendantF Focusability", trình nghe nhấp chuột của tôi vẫn không phản hồi. Những gì tôi đã làm là, tôi đã thay đổi tất cả ImaegButtons thành ImageViews. Điều đó đã giải quyết vấn đề của tôi.
Ajith Memana

Câu trả lời:


730

Tôi chỉ tìm thấy một giải pháp từ đây, nhưng bằng cách nhấp sâu.

Nếu bất kỳ mục hàng nào trong danh sách chứa chế độ xem có thể tập trung hoặc có thể nhấp thì OnItemClickListenersẽ không hoạt động.

Mục hàng phải có thông số như android:descendantFocusability = "blocksDescendants" .

Ở đây bạn có thể thấy một ví dụ về cách mục danh sách của bạn sẽ trông như thế nào. Mục danh sách của bạn xml phải là ... 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>

không làm việc cho tôi Bất cứ ai cũng có thể xem [ stackoverflow.com/questions/21692209/ từ
suitianshi

3
Bạn cũng có thể thiết lập này programatically với listView.setDescendantFocusability(int focus);nơi focuslà một trong những ViewGroup.FOCUS_BEFORE_DESCENDANTS, ViewGroup.FOCUS_AFTER_DESCENDANTShoặcViewGroup.FOCUS_BLOCK_DESCENDANTS
Max Worg

Tôi nghĩ rằng điều này thật buồn cười khi 20 người đã cảm ơn bạn trong một bình luận. Tôi đã gặp vấn đề này trong 8 giờ qua, rất cảm ơn vì điều này.
sparticvs

1
Câu hỏi của tôi là đây là một lỗi android hay là do thiết kế?
fangzhzh

Tôi đã bị mắc kẹt trong điều này trong 6 giờ và tôi thực sự cần sự giúp đỡ. stackoverflow.com/questions353108940/why-cant-i-remove-an-item/ ích
Ruchir Baronia

89

Vấn đề là bố cục của bạn có chứa các mục có thể tập trung hoặc có thể nhấp. Nếu một khung nhìn chứa mục có thể tập trung hoặc có thể nhấp thì OnItemCLickListener sẽ không được gọi.

Nhấn vào đây để biết thêm thông tin.

Vui lòng gửi một trong các xml bố cục của bạn nếu không phải như vậy.


2
Đây là giải pháp cho tôi, tôi đã tuyên bố quan điểm của tôi là có thể nhấp. Cảm ơn!
kingraam

1
Cảm ơn! Tôi đã thay đổi 2 EditTextgiây thành TextViews và CheckBoxđược phép ở lại (và vẫn có thể chuyển đổi) với android:descendantFocusability="blocksDescendants"thêm vào LinearLayout.
Azurespot

Đúng! Tôi đã android:focusableInTouchMode="true"cho hàng, một khi đã gỡ bỏ nó bắt đầu làm việc cuối cùng! :-)
SharpC

58

Đối với danh sách của tôi, các hàng của tôi có những thứ khác có thể được nhấp vào, như các nút, do đó, việc làm chăn blocksDescendantskhông hoạt động. Thay vào đó tôi đã thêm một dòng trong xml của nút:

android:focusable="false"

Điều đó giữ cho các nút chặn các nhấp chuột trên các hàng, nhưng vẫn cho phép các nút thực hiện các nhấp chuột.


@ user1840899 Đây là một phản hồi phổ biến và tôi đã học được từ đó, vì vậy tôi đã chuyển nó đi. Đó là thông tin chính xác, không đáng để bỏ phiếu.
Janene Pappas

Điều này hoạt động với tôi trên một CheckBox trong các mục ListView (không có blockDescendants)
thpitsch

Điều này sửa lỗi trong khi vẫn giữ các nút (ToggleButton cho tôi) có thể nhấp
Mohsen Afshin

Cách duy nhất tôi có thể có được một GridView với RadioButtons khi nó hoạt động là áp dụng android: descendantF Focusability = "blocksDescendants" trên linearLayout có chứa RadioButton và bằng cách đặt android: clickable = "false" trong chính RadioButton.
Stephen McCormick

Tôi đã bị mắc kẹt trong điều này trong 6 giờ và tôi thực sự cần sự giúp đỡ. stackoverflow.com/questions353108940/why-cant-i-remove-an-item/ ích
Ruchir Baronia

34

bạn cần thực hiện 2 bước trong listview_item.xml của bạn

  1. thiết lập bố trí gốc với: android:descendantFocusability="blocksDescendants"
  2. đặt bất kỳ chế độ xem có thể tập trung hoặc có thể nhấp trong mục này với:
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"

Đây là một ví dụ: 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>

Cài đặt clickable="truetrên chế độ xem mục sẽ làm onItemClickcho không được gọi. Vì vậy, hãy chú ý cũng thêm clickable="false"vào chế độ xem gốc của mục, trong trường hợp này làLinearLayout
vovahost

Cài đặt android: descendantF Focusability = "blocksDescendants" giúp tôi. Cảm ơn!
LLIAJLbHOu

21/12/16 và sau nhiều giờ tìm kiếm, NÀY đã hoạt động, cảm ơn người đàn ông!
Tanner Summers

Nếu bạn có cùng bố cục với phong cảnh, v.v ... hãy chắc chắn rằng bạn cũng làm như vậy.
Immy

19

sử dụng mã bên dưới thẻ nút trong bố trí hàng tùy chỉnh của listview

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

Great Man thật sự rất hữu ích !!
divyansh ingle

cái này làm việc ở đây !! Tôi có nhiều hộp kiểm trong chế độ xem này và tôi thử android:descendantFocusability="blocksDescendants"và chặn các hộp kiểm này để nhấp
Armando Marques Sobrinho

17

Tôi có cùng một vấn đề và tôi chỉ thấy tôi đã vô tình đặt ra:

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

trên lớp CustomListViewAdOG của tôi.

Bằng cách thay đổi điều này thành:

return true;

Tôi đã cố gắng khắc phục sự cố. Chỉ trong trường hợp nếu ai đó đã làm sai lầm tương tự ...


7
Tôi cũng đã có một@Override public void onApplicationStart { ExplodeThisDevice(); }
Léon Pelletier

17

Sử dụng android: descendantF Focusability

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

Thêm ở trên trong bố trí gốc


2
Thêm chi tiết có thể làm cho câu trả lời này tốt hơn và +1.
Kẻ giết người

Điều này làm việc cho tôi và nút của tôi trong phần tử danh sách vẫn hoạt động như dự định.
Gustav Eriksson

11

Tôi đã giải quyết nó với sự giúp đỡ của câu trả lời này

1.Thêm vào phần sau trong Bố cục tuyến tính của list_items.xml android:descendantFocusability="blocksDescendants"

2. Các khung nhìn nhỏ của linearLayout trong list_items.xml

 android:focusable="false" 

Liên kết của bạn bị hỏng.
Jason C

1
@JasonC Cảm ơn thông tin của bạn. Đây là Link stackoverflow.com/a/14915758/5740760
RAJESH KUMAR ARUMUGAM

10

nếu bạn có chế độ xem văn bản, nút hoặc stg có thể nhấp hoặc có thể chọn trong chế độ xem hàng của bạn

android:descendantFocusability="blocksDescendants"

Không đủ. Bạn phải đặt

android:textIsSelectable="false"

để xem bài viết của bạn và

android:focusable="false"

đến các nút của bạn và các mục có thể tập trung khác.


Tôi học được điều này một cách khó khăn. android: textIsSelectable = "false" Hãy theo dõi điều này :)
diyoda_

10

Ngay cả khi tôi gặp vấn đề tương tự, tôi cũng gặp phải hộp kiểm, đã làm như sau để masker itemClickListener hoạt động,

Đã thêm các thuộc tính sau vào hộp kiểm,

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

và ItemClickListner bắt đầu làm việc.

Ví dụ chi tiết bạn có thể đi qua liên kết,

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

Hy vọng nó sẽ giúp Cheers !!


5

Tôi đã có cùng một vấn đề và đã thử tất cả các giải pháp được đề cập nhưng không có kết quả. thông qua thử nghiệm tôi thấy rằng làm cho văn bản có thể lựa chọn đã ngăn người nghe được gọi. Vì vậy, bằng cách chuyển nó thành false, hoặc loại bỏ nó, người nghe của tôi đã được gọi lại.

android:textIsSelectable="false"

hy vọng điều này sẽ giúp những người bị mắc kẹt như tôi.


4
  1. Thêm phần này vào Bố cục chính

    android:descendantFocusability="blocksDescendants"
  2. Viết mã này vào mọi nút, Textview, ImageView, v.v. có trên Click

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

Hy vọng nó sẽ làm việc.


3

Hai giải pháp tuyệt vời là, nếu ListFragment mở rộng của bạn từ một đoạn, biết rằng mListView.setOnItemClickListenersẽ không được gọi trước khi hoạt động của bạn được tạo, điều này đảm bảo nó được đặt khi hoạt động được tạo

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

Trong khi xem mã nguồn của ListFragment, tôi đã xem qua

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

Một onItemClickListenerđối tượng được đính kèm và nó gọi onListItemClick() Như vậy là giải pháp tương tự khác, hoạt động theo cùng một cách chính xác là ghi đè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

trong trường hợp của tôi không có thuộc tính bố trí xml nào là không hữu ích.

Tôi chỉ thêm một dòng mã như thế này: 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;
}

về cơ bản, nó thực hiện tương tự như thiết lập các thuộc tính trong bố cục xml nhưng nó chỉ là thứ hoạt động trong trường hợp của tôi.

Nó không phải là thời gian hoàn hảo nhưng có lẽ nó sẽ giúp ai đó mã hóa hạnh phúc


1

Tôi đã thử tất cả các cách trên và KHÔNG CÓ.

Tôi đã giải quyết vấn đề như sau:

Đầu tiên tôi xác định một nút tùy chỉnh được gọi là 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 trông như:

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

Sau đó, tôi xác định ButtonClickedgiao diện Listener của riêng mình :

public interface ButtonClickedListener {
    public void ButtonClicked();
}

Sau đó, tôi sử dụng trình nghe của riêng mình như thể đó là bình thường 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

Tôi có cùng một vấn đề, tôi đã sử dụng một kiểu cho các văn bản của mình trong bố cục hàng có thuộc tính "có thể lấy nét". Nó hoạt động sau khi tôi gỡ bỏ nó.


1

Trong trường hợp của tôi, tôi đã phải xóa dòng tiếp theo khỏi Layout

android:clickable="true"

1

Android: thuộc tính autoText cũng làm cho TextView tự động có thể tập trung.


0

Nếu bạn muốn sử dụng cả nhấp chuột đơn giản và nhấp dài vào danh sách các mục xem cách tốt hơn để thực hiện đó là sử dụng menu ngữ cảnh cho nhấp chuột dài. Tránh sử dụng setItemLongClickListener đặc biệt nếu bạn có nhiều bố cục hàng cho listview của bạn.


0

Đối mặt với cùng một vấn đề, đã cố gắng trong nhiều giờ. Nếu bạn đã thử tất cả các cách trên hơn là thử thay đổi layout_ thong của Listview và danh sách mục thành match_parent từ quấn_content.


0

Tất cả những điều trên đều thất bại đối với tôi. Tuy nhiên, tôi đã có thể giải quyết vấn đề (sau nhiều giờ đập đầu - Google, nếu bạn đang lắng nghe, vui lòng xem xét sửa chữa những gì tôi gặp phải dưới đây dưới dạng lỗi trình biên dịch, nếu có thể)

Bạn thực sự phải cẩn thận với những thuộc tính Android bạn thêm vào bố cục xml của bạn ở đây (trong câu hỏi ban đầu này, nó được gọi là list_items.xml). Đối với tôi, điều gây ra vấn đề là tôi đã chuyển từ chế độ xem Chỉnh sửa sang TextView và có phần còn lại thuộc tính từ thay đổi (trong trường hợp của tôi là inputType). Trình biên dịch đã không bắt được nó và khả năng nhấp chỉ thất bại khi tôi chạy ứng dụng. Kiểm tra kỹ tất cả các thuộc tính bạn có trong các nút xml bố trí của bạn.


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

Sau đó, trong hoạt động của bạn, hãy sử dụng adapter.setOnItemClickListener () trước khi gắn nó vào listview.

Sao chép từ github nó làm việc cho tôi


0

Điều làm việc với tôi là thêm mã dưới đây vào mỗi khung nhìn bên trong bố cục của tệp row.xml của tôi:

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

Vì vậy, trong trường hợp của tôi:

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

Và đây là lệnh gọi setOnItemClickListener của tôi trong lớp con Fragment của tôi:

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
            }

        });

Tôi đã nhận được câu trả lời từ đây !


-1

Tôi đã giải quyết vấn đề bằng cách xóa các chế độ xem có thể nhấp khỏi danh sách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.