2013-08-08 23 views
5

Tôi đã một ListView dân cư với ListItems tùy chỉnh XML, đây là XML:ListView Android không nổi bật khi một OnClickListener được thiết lập

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="?android:attr/listPreferredItemHeight" 
       android:padding="6dip"> 
... 
</RelativeLayout> 

ListView cho thấy một cách chính xác trên màn hình và nếu tôi nhấp hoặc giữ vào một mục nó trở thành màu xanh (tôi đang sử dụng Holo nhẹ Theme)

vấn đề đến khi tôi cố gắng để gán một OnClickListener để xem, bên trong getView trong Hoạt động của tôi kéo dài BaseAdapter:

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
... 
} 

sau khi thực hiện điều đó, màu mục danh sách đánh dấu không được hiển thị nữa, khi tôi nhấp hoặc giữ một mục danh sách, nền của nó vẫn trắng, thì onClickListener sẽ hoạt động hoàn hảo.

Bạn có gợi ý nào để lấy màu đánh dấu trong khi vẫn giữ kiểu mặc định của HoloLight không?

Trả lời

3

Bạn có thể muốn sử dụng OnItemClickListener trên chính mình ListView, thay vì trình lắng nghe nhấp chuột riêng biệt cho chế độ xem mục.

Ngoài ra, vấn đề nổi bật đã được mô tả ở đây: Android listview no longer highlights selection onclick

+0

Những người đã bỏ phiếu, quan tâm để nhận xét về câu trả lời của tôi có vấn đề gì? Bằng cách đó chúng ta sẽ tiến gần hơn đến sự thật. –

+0

tôi đã không, dù sao tôi đã tò mò về OnItemClickListener, bạn có nghĩ rằng điều này sẽ giải quyết vấn đề của tôi? Có bất kỳ vấn đề hiệu suất nào khi sử dụng tách OnClickListener không? - Tôi đã đọc câu hỏi đó, nhưng giải pháp không sử dụng phong cách HoloLight, mà tôi yêu cầu. –

+0

Vâng, nếu các mục của bạn giống nhau, bạn có thể sử dụng một người nghe và phân biệt theo id mục - một đối tượng thay vì có thể là hàng trăm. Đối với holo - bạn có thể sử dụng holo với giải pháp từ câu trả lời đó, sử dụng nền làm nổi bật được gọi là R.drawable.list_selector_holo_dark –

0

Thêm này để bố trí các thuộc tính cho RelativeLayout mẹ:

android:addStatesFromChildren="true" 

Ngoài ra, trong cuộc gọi mã:

convertView.setAddStatesFromChildren(true); 

Trong cả hai trường hợp, hãy đảm bảo rằng bố cục con không có thuộc tính android:duplicateParentState được đặt (và không gọi setDuplicateParentState(true)), o r bạn sẽ nhận được một ngoại lệ tại thời gian chạy.

+0

làm việc cho tôi, phần XML. phần chương trình tôi không thể kiểm tra vì trình biên dịch phàn nàn về phương thức setAddStatesFromChildren "Không tồn tại". Dù sao, tại sao nó phải hoạt động? –

0

Bạn có thể giữ các hành vi nổi bật và có nhiều OnClickListener, nếu bạn

  1. thiết lập OnClickListener
  2. vô hiệu hóa các OnClickListener
  3. gọi các OnClickListener từ một OnItemClickListener.

Để làm như vậy, thêm setClickable(false) mã của bạn:

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
    // make non-clickable again, like before setting the OnClickListener 
    convertView.setClickable(false); 
    ... 
} 

và gọi người nghe theo chương trình, ví dụ:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
{ 
    final View view = inflater.inflate(R.layout.fragment_with_listview, container, false); 
    final ListView your_listview = (ListView) view.findViewById(R.id.your_listview); 
    // delegate to specific callbacks 
    your_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { view.callOnClick(); 
     } 
    }); 
    ... 
} 

Lưu ý các hành vi tài liệu của callOnClick():

Gọi trực tiếp mọi OnClickListener đính kèm. Không giống như performClick(), tính năng này chỉ gọi cho người nghe và không thực hiện bất kỳ hành động nhấp được liên kết nào như báo cáo sự kiện trợ năng.

Các vấn đề liên quan