2012-01-11 33 views
5

Tôi đang cố gắng đặt đầu trang và chân trang trong chế độ xem danh sách của mình là các nút có thể nhấp. Vấn đề là OnClickListener không trả lời bất cứ điều gì và tôi không thể tìm ra những gì tôi đang làm sai.Android: Không thể lấy tiêu đề/chân trang của Chế độ xem ListView có thể nhấp

$ View header = getLayoutInflater().inflate(R.layout.header_layout, null, true); 
    getListView().addHeaderView(header); 

    myAdapter = new myAdapter(this); 

    header.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Do what I want when i click it 
     } 
    }); 

Cập nhật
Giải pháp tốt nhất mà tôi cuối cùng đã đưa ra được thêm một nút riêng để bố trí tiêu đề, và sau đó làm việc đó như thế này:

View header = getLayoutInflater().inflate(R.layout.header_layout, null); 
Button headerButton = (Button)header.findViewById(R.id.header_button); 
getListView().addHeaderView(header); 

headerButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    // My Click Stuff 
    } 
}); 
+0

Bạn có thể đã bỏ lỡ dòng này 'header.setClickable (true)' –

Trả lời

3

Tôi thấy một vài vấn đề:

  • khi lạm phát tiêu đề, sử dụng getListView() như tham số thứ hai (root, nơi bạn có null bây giờ) l
  • nên tiêu đề là một Xem hoặc một ViewGroup? Tôi đã kết thúc bằng cách sử dụng ViewGroup trong những tình huống này.
  • cuối cùng - có lẽ bạn nên đặt trình nghe nhấp chuột vào nút trong tiêu đề thay vì chính tiêu đề?
+0

Đạn thứ ba cố định nó, cũng đảm bảo sử dụng chế độ xem tiêu đề khi tạo nút. Nó gần hơn với những gì tôi đang tìm kiếm. – bbedward

8

Bạn cần phải xử lý các nhấp chuột trong số onItemClick của ListView. Đơn giản chỉ cần kiểm tra xem đó là mục đầu tiên hoặc cuối cùng trong adapter và xử lý các nhấp chuột theo cách đó. Bạn cần coi nó là một mục trong ListView.

0

tôi nghĩ rằng listview và các nút đang chiến đấu để tập trung và danh sách xem của bạn là chiến thắng. bạn sẽ phải sử dụng một onTouchListener cho các nút.

Có một lựa chọn thay thế khác và thiết lập của nó sau đây ở chân trang. Có một phương thức tạo quá tải khác nhưng nó không xuất hiện trong tài liệu, tôi phải kiểm tra tài liệu trực tuyến:

mylistView.addFooterView (footerView, null, false);

trong đó sai cho chân trang không thể chọn được. Tôi đã tự mình thử nghiệm này và các nút bên trong chân trang sẽ phản ứng lại với việc chạm vào ngay bây giờ. Tôi hy vọng câu trả lời này có thể chấp nhận được.

3

Có một cách nhiều giải pháp dễ dàng hơn:

Chỉ cần thiết lập một "OnClickListener" cho View áp dụng:

View view = inflater.inflate(R.layout.xxx, null); 
view.setOnClickListener(new OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
     //do something 
    } 
}); 

điều Rất dễ dàng mà giải quyết nó!

0

gì làm việc cho tôi:

Khi lạm phát quan điểm tiêu đề, trước khi thêm nó vào listview, tôi sau đó sử dụng quan điểm cho rằng để có được những subview và thêm một người biết lắng nghe nhấp chuột vào nó

myHeaderView.findViewById(R.id.myButton).setOnClickListener(new OnClickListener() { ... }); 

cũng , khi tôi đã thêm nó vào ListView, tôi đã sử dụng các nhà xây dựng quá tải với các bộ biến thứ ba để true

mListView.addHeaderView(myHeaderView, null, true); 
0

Như @LuxuryMode nói, bạn nên xử lý L istView's onItemClick.Dưới đây là làm thế nào để làm điều đó:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) { 

// if statement 

} 

Lấy tiêu đề:

if (position == 0) {) 

Lấy footer:

if (position == adapter.getCount()) {) // if there is no header 
if (position == adapter.getCount() + 1) {) // if there is a header 

Có nhiều cách khác để làm điều đó, quá. Dưới đây là một số điều bạn có thể so sánh:

arrayList.size() // number of items in the array (if your adapter is using an array) 
cursor.getCount() // number of data items in the cursor (if your adapter is using a cursor) 
adapter.getCount() // number of data items passed in by the cursor (or at least that is what a custom adapter should report) 
listview.getCount() // number of data items from the adapter + a header and/or footer view 

Vì vậy, sử dụng một tiêu đề hoặc một chân sẽ làm cho listview.getCount() lớn bởi 1 hơn cursor.getCount(). Nếu bạn sử dụng cả một header và footer sau đó nó sẽ lớn bằng 2.

2

Ví dụ với một footer:

mYourListView.addFooterView(footer, null, true); 

Sau đó, trong OnItemClickListener bạn có thể kiểm tra:

@Override 
public void onItemClick(AdapterView<?> parent, 
          View view, final int position, final long id) { 

    if (id != -1) { 
     // do whatever you do with list items 
    } else { 
     // do what you need after the footer been clicked 
    } 

(nếu bạn cần xử lý và đầu trang và nhấp chuột chân trang, kiểm tra vị trí - 0 cho tiêu đề và [adapter.getCount() - 1] cho chân trang)

Cách tiếp cận này sẽ cung cấp cùng một hiệu ứng trực quan ct trong khi footer nhấp vào như thể mục danh sách được nhấp. (Nhưng nếu bạn không cần hiệu ứng đó, chỉ cần thêm OnClickListener vào chân trang và nó sẽ chặn tất cả các nhấp chuột chân trang)

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