8

Ich habe eine RecyclerView mit Expandable untergeordneten Ansichten, wenn die untergeordnete ViewGroup angeklickt wird, bläht eine Anzahl von Ansichten die ViewGroup-Höhe von 0 auf die gemessene Höhe der Viewgroup animiert, wie das folgende gif :Android RecyclerView glatter Bildlauf, um anzuzeigen, dass ihre Höhe animiert

example

Das Problem ist: ich i‘smoothScrollToPosition auf recyclerView, es glatt blättern zu der Ansicht Stellung, aber es hält die aktuelle Ansicht Höhe, die noch nicht erweitert ist, in dem oben gif bin Aufruf Ich berühre die Unteransicht der Recycleransicht, die nicht zur Position scrollt, da die Ansicht bereits sichtbar ist, aber wenn ich sie wieder anfasse (Aufruf der glatten scrolltoposition wieder) es scrollen die Ansicht auf die richtige Position, weil die Ansicht bereits erweitert ist.

Gibt es einen Ansatz, um die Ansicht an den oberen Bildschirmrand zu scrollen oder nur zu scrollen, um den Inhalt sichtbar zu machen?

Für Referenzen: Dies ist die Methode aufgerufen, um die Ansichten aufzublasen:

collapsible_content.removeAllViews(); 
for(int i = 0; i < 5; i++) { 
     View link_view = getLayoutInflater().inflate(R.layout.list_item_timeline_step_link, collapsible_content, false); 
     TextView text = (TextView) link_view.findViewById(R.id.step_link_text); 
     text.setText("Test"); 
     collapsible_content.addView(link_view); 
    } 

Und das ist meine Methode zu erweitern:

public void toggle() { 
     collapsible_content.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     Animation a; 
     if (mExpanded) { 
      a = new ExpandAnimation(collapsible_content.getLayoutParams().height, 0); 
     } else { 
      a = new ExpandAnimation(collapsible_content.getLayoutParams().height, getMeasuredHeight()); 
     } 
     a.setDuration(mAnimationDuration); 
     collapsible_content.startAnimation(a); 
     mExpanded = !mExpanded; 
    } 

Und die Animation:

private class ExpandAnimation extends Animation { 
     private final int mStartHeight; 
     private final int mDeltaHeight; 

     public ExpandAnimation(int startHeight, int endHeight) { 
      mStartHeight = startHeight; 
      mDeltaHeight = endHeight - startHeight; 
     } 

     @Override 
     protected void applyTransformation(float interpolatedTime, 
              Transformation t) { 
      final int newHeight = (int) (mStartHeight + mDeltaHeight * 
        interpolatedTime); 
      collapsible_content getLayoutParams().height = newHeight; 

      if (newHeight <= 0) { 
       collapsible_content setVisibility(View.GONE); 
      } else { 
       collapsible_content setVisibility(View.VISIBLE); 
      } 
      collapsible_content requestLayout(); 
     } 


     @Override 
     public boolean willChangeBounds() { 
      return true; 
     } 
    } 

Antwort

7

Meine Lösung war auf ständige Kontrolle für Ansicht unten innerhalb applyTransformation Methode und vergleichen Sie es mit RecyclerView Höhe, wenn der Boden höher erhalten als die RV Höhe, blättern i durch die diff-Werte:

final int bottom = collapsible_content.getBottom(); 
final int listViewHeight = mRecyclerView.getHeight(); 
if (bottom > listViewHeight) { 
    final int top = collapsible_content.getTop(); 
    if (top > 0) { 
     mRecyclerView.smoothScrollBy(0, Math.min(bottom - listViewHeight + mRecyclerView.getPaddingBottom(), top)); 
    } 
} 

Der Trick war, Math.min zu verwenden, um die Ansicht nach oben zu bekommen, also wird nicht nach oben geblättert, wodurch der obere Teil nicht sichtbar ist.

Lösung auf Basis von ListViewAnimations

0

Fügen Sie einen Animationslistener hinzu und starten Sie das Scrollen der Recycleransicht nach dem expandierenden Anima ist beendet.

+0

Ich tat dies, aber ich möchte blättern, während die Ansicht animiert, war mein Ansatz eine Animation Zuhörer hinzufügen zu überprüfen, ob der Boden Y der Blick aus dem RecyclerView ist, dann Rufen Sie smoothscrollby auf, geben Sie den Wert der Pixel aus, aber ich schaffte es nicht, wie das geht –

+0

Okay, also Sie wollen Bith Animationen parallel – Mann

+0

Ich denke, Sie müssen die Höhe der Ansicht "vortäuschen" eine höhere Ansicht vorgeben – Mann

Verwandte Themen