8

Mam widok RecyclerView z rozwijanymi widokami podrzędnymi, gdy kliknięto grupę podrzędną ViewGroup, powoduje ona zwiększenie liczby widoków, które podnoszą wysokość widoku od 0 do zmierzonej wysokości grupy wyświetlania, na przykład następującego po nim gifa :Android RecyclerPrzejście przewijanie do widoku animującego ich wysokość

example

problemem jest: Dzwonię smoothScrollToPosition na recyclerView, to gładkie przewijania do pozycji widoku, ale uzna bieżącą wysokość widoku, który nie jest jeszcze rozwinięty w powyższym gif I” m dotykając pod podglądem recyklingu, który nie jest przewijany do pozycji, ponieważ widok jest już widoczny, ale po ponownym dotknięciu (wywołanie gładkiej scrolltoposition ponownie) przewija widok do właściwej pozycji, ponieważ widok jest już rozwinięty.

Czy istnieje podejście do przewijania widoku na górę ekranu lub po prostu przewijania, aby treść była widoczna?

przypadku powołań: Jest to metoda zwana nadmuchać poglądy:

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); 
    } 

A to jest moja metoda, aby rozwinąć:

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; 
    } 

a animacja:

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; 
     } 
    } 

Odpowiedz

7

Moje rozwiązanie było stałego zameldowania na widok dnie wewnątrz metody applyTransformation, i porównać je z wysokości RecyclerView, jeżeli dno dostać wyższy niż wysokość RV, i przewijać przez wartości Diff:

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)); 
    } 
} 

Sztuką było użycie Math.min, aby uzyskać widok z góry, więc nie przewija w górę, czyniąc górę niewidoczną.

Rozwiązanie oparte na ListViewAnimations

0

Dodaj listę animacji i rozpocznij przewijanie widoku recycler po rozwinięciu anima zakończenie jest zakończone.

+0

Zrobiłem to, ale chcę, aby przewijać podczas gdy widok jest animowanie, moje podejście było dodać detektor animacji, aby sprawdzić, czy dolna Y zdania jest poza RecyclerView, a następnie call smoothscrollby podając wartość pikseli, ale nie poradziłem sobie z tym, jak to zrobić –

+0

Okej, więc chcesz bith animacje parallely – Mann

+0

Myślę, że musisz "podrobić" wysokość widoku, aby udawać wyższy widok – Mann

Powiązane problemy