2014-08-29 17 views
8

Wygląda ustawiania układu artykuł RecyclerView do klikania = „true”, zużywają kilka zdarzeń dotykowych całkowicie, szczególnie MotionEvent.ACTION_DOWN (ACTION_MOVE i ACTION_UP potem pracują):Android: RecyclerView poz gdy ustawiono klikalne bloków onTouch wydarzeń

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> 

Mając bardzo podstawową konfigurację RecyclerView w 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; 
      } 
     }); 

Czy to zamierzone zachowanie lub błąd w RecyclerView powoduje, że nadal jest to podgląd?

PS. Chcę, aby to było klikalne, jak na dokumenty, aby reagować na wciśnięty stan i mają wpływ na kliknięcie. Gdy ustawione na false ACTION_DOWN działa poprawnie, ale wciśnięty stan nie jest wyzwalany, a wybórBackground nie ma żadnego efektu.

+0

Spróbuj ustawić 'android: focusable =" true "', Nie testowałem tego, dlatego nie dostarczam to odpowiedź, ale dla mnie ACTION_DOWN wydaje się wydarzeniem związanym z fokusem. – RyanJohnstone

+0

@Iija, czy masz jakieś rozwiązanie? Utknąłem na tym samym problemie już od kilku dni. – Manu

+0

@Manu, skończyło się na tym, że to zamierzone zachowanie. Powinieneś być w stanie osiągnąć to, co chcesz, używając zamiast tego recyclerView.addOnItemTouchListener() .... –

Odpowiedz

0

To jest zamierzone zachowanie NIE błąd.

Po ustawieniu elementu, który można kliknąć true, zostanie zużyte ACTION_DOWN, widok recyklera NIGDY nie otrzyma ACTION_DOWN.

Dlaczego potrzebujesz ACTION_DOWN w onTouch() widoku recycler? Czy to konieczne? jeśli chcesz ustawić lastY w ACTION_DOWN, dlaczego nie jest to

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; 

Czy chcesz? jeśli nadal chcesz ACTION_DOWN, spróbuj go aktywować, na przykład:

public boolean dispatchTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_DOWN) 
    lastY = ev.getRawY(); 
    return super.dispatchTouchEvent(ev);