2015-06-28 12 views
9

Tôi có một RecyclerView (với LinearLayoutManager) và một RecyclerView.ItemDecoration tùy chỉnh cho nó.Làm cách nào để xử lý sự kiện nhấp trong RecyclerView.ItemDecoration?

Giả sử, tôi muốn có các nút ở chế độ xem trang trí (vì một số lý do ..).

Tôi thổi phồng bố cục bằng nút, nó vẽ chính xác. Nhưng tôi không thể làm cho nút có thể nhấp được. Nếu tôi bấm vào nó, không có gì xảy ra (nó vẫn giữ nguyên, không có hiệu ứng nhấn) và sự kiện onClick không kích hoạt.

Cấu trúc của ItemDecoration bố trí là

<LinearLayout> 
    <TextView/> 
    <Button/> 
</LinearLayout> 

Và tôi đang cố gắng để thiết lập người nghe trong ViewHolder của trang trí

class ItemDecorationHolder extends RecyclerView.ViewHolder { 
    public TextView header; 
    public Button button; 

    public HeaderHolder(View itemView) { 
     super(itemView); 

     header = (TextView)itemView.findViewById(R.id.header); 
     button = (Button)itemView.findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //.. Show toast, etc. 
      } 
     }); 
    } 
} 

Và tôi đang vẽ trang trí trong phương pháp onDrawOver. (thực ra, tôi đang sửa đổi mã này: https://github.com/edubarr/header-decor)

Bất kỳ ý tưởng nào? Nó có thể làm được không?

Cảm ơn!

Trả lời

6

Trong khi tiêu đề thực đang cuộn ra khỏi màn hình, hình ảnh hiển thị đang vẽ trực tiếp trên canvas, không giống như tiện ích tương tác thông thường.

Bạn có các tùy chọn

  1. Override RecyclerView.onInterceptTouchEvent(), mặc dù với một số xâm lấn vì vậy tôi thích kế tiếp.
  2. Sử dụng RecyclerView.addOnItemTouchListener(), hãy nhớ đối số sự kiện chuyển động đã được dịch sang hệ tọa độ của RecyclerView.
  3. Sử dụng chế độ xem tiêu đề thực, nhưng điều đó sẽ đi xa một chút.

Nếu bạn chọn tùy chọn 1/2, Button.setPressed (true) và vẽ lại tiêu đề sẽ có hiệu ứng báo chí trực quan.

0

Như Neil đang chỉ ra, mọi thứ trở nên phức tạp hơn thế. Tuy nhiên theo định nghĩa bạn không thể.

Vì vậy, tại sao không bao gồm thư viện tốt làm điều đó và hơn thế nữa? Tôi đề xuất công việc khó khăn của tôi cho tiêu đề dính có thể nhấp trong dự án FlexibleAdapter, sử dụng chế độ xem thực (không phải trang trí) để xử lý các sự kiện nhấp chuột trên tiêu đề khi dính.

Ngoài ra còn có bản trình diễn làm việc và Wiki page trên phần đó (và không chỉ).

2

Ngoài những gì Neil cho biết, câu trả lời ở đây có thể hữu ích. Passing MotionEvents from RecyclerView.OnItemTouchListener to GestureDetectorCompat

Và sau đó bạn chỉ cần tính chiều cao của tiêu đề và xem liệu lần nhấp có rơi vào chế độ xem tiêu đề đó hay không và tự xử lý sự kiện.

private class RecyclerViewOnGestureListener extends GestureDetector.SimpleOnGestureListener { 
    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     float touchY = e.getY(); 



     ALLog.i(this, "Recyclerview single tap confirmed y: " + touchY); 
     //mGroupHeaderHeight is the height of the header which is used to determine whether the click is inside of the view, hopefully it's a fixed size it would make things easier here 
     if(touchY < mGroupHeaderHeight) { 
      int itemAdapterPosition = mRecyclerView.getLayoutManager().getPosition(mRecyclerView.findChildViewUnder(0, mGroupHeaderHeight)); 

      //Do stuff here no you have the position of the item that's been clicked 
      return true; 
     } 
     return super.onSingleTapConfirmed(e); 

    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     float touchY = e.getY(); 

     if(touchY < mGroupHeaderHeight) { 
      return true; 
     } 
     return super.onDown(e); 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     float touchY = e.getY(); 

     if(touchY < mGroupHeaderHeight) { 
      return true; 
     } 
     return super.onSingleTapUp(e); 
    } 
} 
Các vấn đề liên quan