2014-08-29 18 views
8

Hình như thiết lập bố cục mục RecyclerView để có thể click = "true", tiêu thụ một số sự kiện liên lạc hoàn toàn, particulary MotionEvent.ACTION_DOWN (ACTION_MOVE và ACTION_UP sau đó đang làm việc):Android: RecyclerView mục khi thiết lập để ngăn chặn nhấp được sự kiện onTouch

item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/demo_item_container" 
    android:layout_width="match_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:background="?android:attr/selectableItemBackground" 
    android:clickable="true"> <-- this what breaks touch event ACTION_DOWN 

....  
</LinearLayout> 

Có thiết lập RecyclerView rất cơ bản trong onCreate():

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);  
... //Standard recyclerView init stuff 

//Please note that this is NOT recyclerView.addOnItemTouchListener() 
recyclerView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       Log.d("", "TOUCH --- " + motionEvent.getActionMasked()); 
       //Will never get here ACTION_DOWN when item set to android:clickable="true" 
       return false; 
      } 
     }); 

Hành vi hoặc lỗi được dự định trong RecyclerView có phải là bản xem trước không?

PS. Tôi muốn điều này có thể nhấp được theo tài liệu để phản ứng trên trạng thái nhấn và có hiệu ứng gợn khi nhấp chuột. Khi được đặt thành sai ACTION_DOWN đang hoạt động tốt nhưng trạng thái đã nhấn không được kích hoạt và có thể chọnBackground không có bất kỳ tác dụng nào.

+0

Hãy thử đặt 'android: focusable =" true "', tôi chưa thử nghiệm điều này, đó là lý do tại sao tôi không cung cấp nó như một câu trả lời, nhưng ACTION_DOWN với tôi có vẻ giống như một sự kiện tập trung liên quan. – RyanJohnstone

+0

@Iija, Bạn có nhận được giải pháp nào không? Tôi bị mắc kẹt trên cùng một vấn đề trong một vài ngày nay. – Manu

+0

@Manu, tôi đã nghĩ đây là hành vi dự định. Bạn sẽ có thể đạt được những gì bạn muốn bằng cách sử dụng recyclerView.addOnItemTouchListener() thay vào đó .... –

Trả lời

0

Đây là hành vi dự định KHÔNG phải là lỗi.

Khi đặt mục có thể nhấp đúng, ACTION_DOWN sẽ được sử dụng, chế độ xem recycler sẽ KHÔNG BAO GIỜ nhận được ACTION_DOWN.

Tại sao bạn cần ACTION_DOWN trong onTouch() của chế độ xem tái chế? Nó có cần thiết không? nếu bạn muốn đặt lastY trong ACTION_DOWN, tại sao không phải là này

case MotionEvent.ACTION_MOVE: 
     if (linearLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) { 
     // initial 
     if (lastY == -1) 
      lastY = y; 

     float dy = y - lastY; 
     // use dy to do your work 

     lastY = y; 
     break; 
    case:MotionEvent.ACTION_UP: 
     // reset 
     lastY = -1; 
     break; 

Bạn có muốn không? nếu bạn vẫn muốn ACTION_DOWN, hãy cố gắng đưa nó vào hoạt động, chẳng hạn như:

public boolean dispatchTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_DOWN) 
    lastY = ev.getRawY(); 
    return super.dispatchTouchEvent(ev); 
Các vấn đề liên quan