Android RecyclerView плавный прокрутки для просмотра, что оживляет их рост

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

пример

Проблема заключается в следующем: я вызываю smoothScrollToPosition на recyclerView, он плавно прокручивается до позиции представления, но рассматривает текущую высоту представления, которая еще не расширена, в приведенном выше gif, я касаюсь просмотра в режиме recyclerview, Которые не прокручиваются до позиции, потому что представление уже видно, но когда я снова коснусь (повторное повторное включение), он просматривает представление в правильное положение, потому что представление уже расширено.

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

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

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

Solutions Collecting From Web of "Android RecyclerView плавный прокрутки для просмотра, что оживляет их рост"

Мое решение состояло в том, чтобы постоянно проверять нижнюю часть представления в методе applyTransformation и сравнивать его с высотой RecyclerView, если нижняя высота выше высоты RV, я прокручиваю значения 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)); } } 

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

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

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