6

Ich habe ein RecyclerView mit einem LinearLayoutManager und einer Adapter:Klicken Sie durch ein RecyclerView Listenelement

@Override public int getItemViewType(int position) { 
    return position == 0? R.layout.header : R.layout.item; 
} 

hier header.xml:

<View xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/header" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/header_height" 
    /> 

Was ich will ist erreichen, um ein Loch in die RecyclerView, wo ich durch irgendetwas hinter dem RecyclerView klicken kann. Ich habe versucht, viele Kombinationen der folgenden Attribute ohne Erfolg:

 android:background="@android:color/transparent" 
     android:background="@null" 
     android:clickable="false" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:longClickable="false" 

Wie kann ich das erste Element transparent zu machen (so dass Touch-Ereignisse zu etwas dahinter) in der Liste aus, aber lassen Sie es immer noch den Platz einnehmen?

Antwort

8

könnten Sie setzen den OnClickListener/OnTouchListener aller Ihrer „Löcher“ an die Eltern der Ansicht hinter dem RecyclerView und delegieren einem der MotionEvent und Touch-Ereignisse zu diesem Elternteil ViewGroup ‚s Touch-Bedienung.

Update durch TWiStErRob:

class HeaderViewHolder extends RecyclerView.ViewHolder { 
    public HeaderViewHolder(View view) { 
     super(view); 
     view.setOnTouchListener(new OnTouchListener() { 
      @Override public boolean onTouch(View v, MotionEvent event) { 
       // http://stackoverflow.com/questions/8121491/is-it-possible-to-add-a-scrollable-textview-to-a-listview 
       v.getParent().requestDisallowInterceptTouchEvent(true); // needed for complex gestures 
       // simple tap works without the above line as well 
       return behindView.dispatchTouchEvent(event); // onTouchEvent won't work 
      } 
     }); 

Es gibt nichts besonderes benötigte in der XML, einfach nur Ansichten (keines der Attribute in der Frage). v.getParent() ist die RecyclerView und diese lange Methode stoppt es, eine Scroll-Geste zu starten, während Sie Ihren Finger auf dem "Loch" halten.

Meine "Loch" -Ansicht in der Liste hat auch einen halbtransparenten Hintergrund, aber das ist egal, weil wir die Berührungen von Hand liefern.

+0

Hmm, interessant :) Ich möchte komplexe Gesten funktionieren (z. B. Swipe), so dass nur der Touch-Listener einen Versuch wert ist. – TWiStErRob

+0

Außerdem können Sie dem 'RecyclerView' erlauben, Löcher für alle Berührungen zu identifizieren, die Sie behandeln möchten, und dann an die Rückseite delegieren, wenn die Ereignisse heilig sind;) – puj

+0

Sehr cooler Typ! – puj

Verwandte Themen