Yur*_*upa 8 java android android-animation android-scroll android-recyclerview
我有一个带有可扩展子视图的RecyclerView,当单击子ViewGroup时,它会将ViewGroup高度从0调整为测量视图组高度的视图数量膨胀,如下面的gif所示:

问题是:我在recyclerView上调用smoothScrollToPosition,它平滑滚动到视图位置,但是在上面的gif中我认为当前的视图高度仍然没有展开,我正在回收在recyclerview的视图下面,由于视图已经可见,因此不会滚动到位置,但是当我再次触摸(再次调用smoothscrolltoposition)时,它会将视图滚动到正确的位置,因为视图已经展开.
有没有办法将视图滚动到屏幕顶部或只是滚动以使内容可见?
对于引用:这是调用以扩展视图的方法:
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);
}
Run Code Online (Sandbox Code Playgroud)
这是我扩展的方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
和动画:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的解决方案是在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));
}
}
Run Code Online (Sandbox Code Playgroud)
诀窍是使用Math.min来获取顶部视图,因此它不会向上滚动使顶部不可见.
基于ListViewAnimations的解决方案
| 归档时间: |
|
| 查看次数: |
16972 次 |
| 最近记录: |