8

У меня есть RecyclerView с расширяемыми детскими представлениями, когда щелкнули дочернюю группу ViewGroup, она раздувает количество просмотров, оживляющих высоту ViewGroup от 0 до измеренной высоты группы просмотра, например, следующий gif :Android RecyclerView гладкая прокрутка для просмотра, что оживляет их высоту

example

проблема: Я звоню smoothScrollToPosition на recyclerView, она гладкая прокрутки позиции просмотра, но он считает текущую высоту вида, который до сих пор не расширен, в приведенном выше GIF я» m, касаясь просмотра под видом recyclerview, которые не прокручиваются до позиции, потому что представление уже видно, но когда я касаюсь снова (называя гладкое scrolltoposition снова), он прокручивает представление до правильной позиции, потому что представление уже расширено.

Есть ли способ прокрутить представление до верхней части экрана или просто прокрутить, чтобы сделать контент видимым?

Для справки: Этот метод называется надуть просмотров:

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

И это мой метод расширения:

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

и анимация:

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

ответ

7

Мое решение было постоянной проверки для просмотра дна в методе applyTransformation, и сравнить его с высоты RecyclerView, если дно получить больше, чем высота RV, я прокручивать значения дифф:

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

Хитрость должен был использовать Math.min, чтобы получить вид сверху, поэтому он не прокручивает вверх, делая вершину невидимой.

Решение основано на ListViewAnimations

0

Добавьте аниматор и запустите прокрутку recyclerview после расширения anima завершено.

+0

Я сделал это, но я хочу, чтобы прокрутить в то время как точка зрения анимации, мой подход был добавить анимацию слушателя, чтобы проверить, если дно Y из зрения из RecyclerView, то call smoothscrollby, давая значение пикселей, но я did not управляю как к этому –

+0

Хорошо, так что вы хотите анимацию бита parallly – Mann

+0

Я думаю, вам нужно «подделать» высоту представления, чтобы притворяться более высокого вида – Mann

Смежные вопросы