2017-10-19 1 views
0

ich eine Vollbild-RecyclerView haben, die eine unsichtbare ViewHolder Artikel haben wird, wie untenWie klickt man auf eine Ansicht, die hinter dem unsichtbaren ViewHolder-Element eines RecyclerViews sichtbar ist?

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
    .... 
    if (position == 6) { 
     viewHolder.itemView.setMinimumHeight(Resources.getSystem().getDisplayMetrics().heightPixels); 
     viewHolder.itemView.setVisibility(View.GONE); 
     viewHolder.setIsRecyclable(false); 
    } 
    ... 

} 

Sobald 6 die Position auf dem Bildschirm erscheint, kann ich die Image dahinter sehen, und ich möchte in der Lage sein, um darauf zu klicken. Ich habe einen Ereignishandler zu diesem ImageView hinzugefügt, aber er wird nicht ausgelöst. Es scheint, dass RecyclerView verhindert, dass das Klickereignis durchgebrannt wird. Gibt es eine Möglichkeit, auf eine Ansicht durch unsichtbares/gegangenes RecyclerView ViewItem zu klicken?

+0

Check [diese Antwort] (https://stackoverflow.com/a/29066665/752630) – mbonnin

Antwort

0

Da ich die Frage gestellt, habe ich versucht, mehrere Techniken/Methoden, die/sollte die Klick-/Tap-Ereignis bis in die Ansichtshierarchie aber nichts funktionierte passieren konnte. Die Funktion, die ich in der App einbauen wollte, war sehr komplex und die App selbst wurde sehr kompliziert. Zu viele Ansichten übereinander und globale Event-Handler machten die Implementierung schwieriger.

Also habe ich als letzten Ausweg beschlossen, einen leeren/transparenten Ansichtshalter im RecyclerView zu haben, der die Klick- und Berührungsereignisse abhört und basierend auf den Koordinaten des Berührungsereignisses verschiedene Aktionen abfange. Hier ist der Code:

private float[] lastTouchDownXY = new float[2]; 

public MyView getMyView(final Context context) {  
    MyView view = new MyView(context); 

    view.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
       lastTouchDownXY[0] = motionEvent.getRawX(); 
       lastTouchDownXY[1] = motionEvent.getRawY(); 
      } 

      return false; 
     } 
    }); 

    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final float x = lastTouchDownXY[0]; 
      final float y = lastTouchDownXY[1]; 
      int[] mLocButton = new int[2]; 
      // mButton is the button in the background and visible thru transparent viewholder 
      mButton.getLocationOnScreen(mLocButton); 
      final int left = mLocButton[0]; 
      final int top = mLocButton[1]; 

      if (x > (left - mOffset) && x < (left + mOffset + mButtonWidth) && 
        y > (top - mOffset) && y < (top + mOffset + mMuteUnmuteButtonHeight)) { 
       // mButton clicked 
      } else { 
       // entire view clicked except mButton clickable area 
      } 
     } 
    }); 

    return view; 
} 
Verwandte Themen