2010-06-15 36 views
56

Tôi muốn hiển thị một Button bên trong ListView. Mục tiêu phải là nhấp vào đường dây ListView hoặc trên nút.ListView và các nút bên trong ListView

Nhấp vào dòng nó hiển thị thêm thông tin. Nhấp vào nút hiển thị ở các nút dưới cùng.

Giống như ứng dụng GMAIL.

Ở bên phải có hộp kiểm và sau khi nhấp vào hộp kiểm ở dưới cùng, thanh nút xuất hiện.

Vấn đề của tôi sau khi chèn nút vào ListView, nút này không thể nhấp được. Nếu tôi thêm số LinearLayout từ nút llButton.setClickable() thì nó hoạt động. Nhưng, chỉ có nút. Bản thân ListView không phản ứng trên các lần nhấp nữa!

Tôi đã thử this example.

Vấn đề tương tự như trên ...

+0

Bạn có thử sử dụng Trình đơn ngữ cảnh cho listview? – primpap

+0

Có tôi có một menu ngữ cảnh, nhưng tôi cũng muốn thêm một hộp kiểm. – chrisonline

+0

Có lẽ câu trả lời của tôi về câu hỏi này [http://stackoverflow.com/q/7533027/562935) có thể hữu ích. – tidbeck

Trả lời

8

Nếu bạn đang sử dụng một Adapter tùy chỉnh các nút bấm bên trong một ListView sẽ không làm việc vì vậy bạn nên cố gắng sử dụng đoạn mã sau để kiểm tra OnItemClickListener.

listId.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> list, View v, int pos, long id) { 
     // Your code for item clicks 
    } 
}); 
+8

Câu trả lời được cung cấp bởi teh1 dưới đây là tốt hơn. –

+0

@Venky plz xem qua liên kết này http://stackoverflow.com/questions/12346481/onclick-button-in-listview-in-android –

116

Chỉ cần để làm cho điều này rõ ràng - và không ai dường như có nói một cái gì đó đơn giản này - trong khi một là không được phép có một tác phẩm nút đặt tiêu điểm kết hợp với giao diện danh sách, có một giải pháp đơn giản hơn nhiều cho việc này .

Câu trả lời được chấp nhận là một câu trả lời - bạn nên luôn làm điều đó khi đặt trình nghe nhấp chuột cho các mục danh sách, do đó thật ngớ ngẩn khi OP không biết điều đó.

Nếu bạn đang sử dụng một layout XML như mục danh sách của bạn, bạn chỉ cần thiết lập các nút để có các thuộc tính sau đây và nó sẽ gây ra các mục trong danh sách được nhấp cũng như:

android:focusable="false"

+0

Cảm ơn bạn, nó đã khắc phục được sự cố mà tôi đang gặp phải! – Yosi199

+0

Thật kỳ lạ, mẹo này không hoạt động với ImageButton. Biết bất kỳ điều đó làm gì? –

+25

Tôi đoán nó không phải là lạ, nhìn thấy như ImageButton mở rộng ImageView, trong khi nút mở rộng TextView. Với ImageButton. thủ thuật này không hoạt động, nhưng phải được đặt sau khi thay đổi khả năng hiển thị. (Đó là vấn đề của tôi). –

7

Để có sự kiện được kích hoạt khi một trong hai nút hoặc các mục trong danh sách được nhấp, bạn có thể làm như sau:

bạn chỉ xử lý onItemClick:

mListView.setOnItemClickListener(new ListView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> a, View v, int i, long l) { 
     // handle click here 
    } 
); 

Trong adapter bạn sửa đổi nút để không thể nhấp vào/thể đặt tiêu điểm (hoặc làm điều này trong file xml thay):

public class MyAdapter extends BaseAdapter { 
    ... 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ..... 
     Button btn = view.findViewById(R.id.button); 
     btn.setFocusable(false); 
     btn.setClickable(false);    
    } 
} 
16

Thêm dòng dưới đây vào danh sách mục XML của bạn.

android:descendantFocusability="blocksDescendants" 

Sau đó mục danh sách của bạn sẽ như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:descendantFocusability="blocksDescendants" 
android:layout_height="wrap_content" > 

    // Your layout objects here 

</RelativeLayout> 
+1

Đây là câu trả lời duy nhất khắc phục sự cố của tôi –

+1

tương tự đối với tôi. tạm biệt – Xan

0

Trong trường hợp của tôi, tôi đã phải thêm thuộc tính này trong ListView:

<ListView 
... 
android:clickable="true" 
... 
</ListView> 

Và trong adapter chỉ cần thêm vào nhấp vào trình nghe trong chế độ xem nút.

wrapper.getButtonHi().setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      DebugUtils.logDebug("Clickeado :: "+ mContact.getUserId()); 
     } 
}); 

của nó quan trọng để thiết lập cuối cùng biến:

public View getRowView(final int position, View convertView, ViewGroup parent) { 
    final BrowseContactItemWrapper wrapper; 
    final UserModel mContact = lstContact.get(position); 
    ..... 
} 
Các vấn đề liên quan