2014-08-29 12 views
8

Sieht aus wie RecyclerView Stück Layout klickbare = "true", verbrauchen einige Touch-Ereignisse vollständig, besonders MotionEvent.ACTION_DOWN Einstellung (ACTION_MOVE und ACTION_UP danach arbeiten):Android: RecyclerView Element, wenn in anklickbare Blöcke OnTouch Ereignisse gesetzt

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> 

mit sehr einfachen RecyclerView Setup in 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; 
      } 
     }); 

Ist das beabsichtigte Verhalten oder Fehler in RecyclerView, weil es immer noch eine Vorschau ist?

PS. Ich möchte, dass diese wie in der Dokumentation anklickbar ist, um auf den gedrückten Zustand zu reagieren und beim Klicken Klickeffekte zu haben. Bei falscher Einstellung funktioniert ACTION_DOWN einwandfrei, aber der gedrückte Status wird nicht ausgelöst, und selectableBackground hat keine Auswirkungen.

+0

Versuchen 'android Einstellung: fokussierbarem =„true“', ich habe nicht getestet, weshalb ich nicht bin Bereitstellung es als eine Antwort, aber ACTION_DOWN zu mir scheint wie ein fokusbezogenes Ereignis. – RyanJohnstone

+0

@Iija, Hast du irgendeine Lösung bekommen? Ich stecke jetzt seit einigen Tagen an demselben Problem fest. – Manu

+0

@Manu, dachte ich, dies ist das beabsichtigte Verhalten. Sie können erreichen, was Sie wollen, indem Sie stattdessen recyclerView.addOnItemTouchListener() verwenden .... –

Antwort

0

Dies ist beabsichtigt Verhalten kein Fehler.

Wenn das Element klickbar auf True gesetzt ist, wird ACTION_DOWN verbraucht, die Recycler-Ansicht erhält NIEMALS ACTION_DOWN.

Warum benötigen Sie ACTION_DOWN in onTouch() der Recycler-Ansicht? Ist es notwendig? wenn Sie Lasty in ACTION_DOWN setzen wollen, warum nicht diese

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; 

Ist es möchten Sie? wenn Sie immer noch die ACTION_DOWN wollen, versuchen Sie es in Aktivität zu erhalten, wie zum Beispiel:

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