我实现了一个具有回收器视图的折叠工具栏布局,如附带的示例代码所示.我的问题是,当我把这个列表向下排列时,它不会一直到顶端.
会发生什么,滚动停止在AppBarLayout应该结束的地方.
我想要的效果是将列表向下移动,列表将一路向上,并显示/展开AppBarLayout
我的minSdk是14.任何帮助或建议是非常感谢.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout> <android.support.design.widget.CollapsingToolbarLayout app:layout_scrollFlags="scroll|exitUntilCollapsed"> <LinearLayout app:layout_collapseMode="parallax"> //some elements </LinearLayout> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v7.widget.RecyclerView app:layout_behavior="@string/appbar_scrolling_view_behavior"/> //value android.support.design.widget.AppBarLayout$ScrollingViewBehavior <android.support.v7.widget.Toolbar app:popupTheme="@style/AppTheme.PopupOverlay" app:layout_collapseMode="parallax" />@H_502_12@
解决方法
您可以使用
setExpanded()
方法完全展开或折叠App Bar.一个实现可能会覆盖您的Activity类中的dispatchTouchEvent(),并根据是否在中间点折叠来自动折叠/展开您的App Bar:
@Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { float per = Math.abs(mAppBarLayout.getY()) / mAppBarLayout.getTotalScrollRange(); boolean setExpanded = (per <= 0.5F); mAppBarLayout.setExpanded(setExpanded,true); } return super.dispatchTouchEvent(event); }
关于自动滚动到最后的位置,我在GitHub上放了一些代码,显示如何programmatically smooth scroll to a specific location可能有帮助.调用滚动到list.size() – 1在一个逃跑的例子可以复制的行为.这部分代码的方式是从StylingAndroid和Novoda博客改编:
public class RecyclerLayoutManager extends LinearLayoutManager { private AppBarManager mAppBarManager; private int visibleHeightForRecyclerView; public RecyclerLayoutManager(Context context) { super(context); } @Override public void smoothScrollToPosition(RecyclerView recyclerView,RecyclerView.State state,int position) { View firstVisibleChild = recyclerView.getChildAt(0); final int childHeight = firstVisibleChild.getHeight(); int distanceInPixels = ((findFirstVisibleItemPosition() - position) * childHeight); if (distanceInPixels == 0) { distanceInPixels = (int) Math.abs(firstVisibleChild.getY()); } //Called Once if (visibleHeightForRecyclerView == 0) { visibleHeightForRecyclerView = mAppBarManager.getVisibleHeightForRecyclerViewInPx(); } //Subtract one as adapter position 0 based final int visibleChildCount = visibleHeightForRecyclerView/childHeight - 1; if (position <= visibleChildCount) { //Scroll to the very top and expand the app bar position = 0; mAppBarManager.expandAppBar(); } else { mAppBarManager.collapseAppBar(); } SmoothScroller smoothScroller = new SmoothScroller(recyclerView.getContext(),Math.abs(distanceInPixels),1000); smoothScroller.setTargetPosition(position); startSmoothScroll(smoothScroller); } public void setAppBarManager(AppBarManager appBarManager) { mAppBarManager = appBarManager; } private class SmoothScroller extends LinearSmoothScroller { private static final int TARGET_SEEK_SCROLL_DISTANCE_PX = 10000; private final float distanceInPixels; private final float duration; public SmoothScroller(Context context,int distanceInPixels,int duration) { super(context); this.distanceInPixels = distanceInPixels; float millisecondsPerPx = calculateSpeedPerPixel(context.getResources().getDisplayMetrics()); this.duration = distanceInPixels < TARGET_SEEK_SCROLL_DISTANCE_PX ? (int) (Math.abs(distanceInPixels) * millisecondsPerPx) : duration; } @Override public PointF computeScrollVectorForPosition(int targetPosition) { return RecyclerLayoutManager.this .computeScrollVectorForPosition(targetPosition); } @Override protected int calculateTimeForScrolling(int dx) { float proportion = (float) dx / distanceInPixels; return (int) (duration * proportion); } } }
编辑:
以上代码片段中的AppBarManager是指用于与活动中的AppBarLayout通信的界面.使用动画来折叠/展开应用程序栏方法.最终的方法用于计算屏幕上可见的RecyclerView行数:
public interface AppBarManager { void collapseAppBar(); void expandAppBar(); int getVisibleHeightForRecyclerViewInPx(); }
public class MainActivity extends AppCompatActivity implements AppBarManager{ @Override public void collapseAppBar() { mAppBarLayout.setExpanded(false,true); } @Override public void expandAppBar() { mAppBarLayout.setExpanded(true,true); } @Override public int getVisibleHeightForRecyclerViewInPx() { if (mRecyclerFragment == null) mRecyclerFragment = (RecyclerFragment) getSupportFragmentManager().findFragmentByTag(RecyclerFragment.TAG); int windowHeight,appBarHeight,headerViewHeight; windowHeight = getWindow().getDecorView().getHeight(); appBarHeight = mAppBarLayout.getHeight(); headerViewHeight = mRecyclerFragment.getHeaderView().getHeight(); return windowHeight - (appBarHeight + headerViewHeight); }@H_502_12@ @H_502_12@ 原文链接:https://www.f2er.com/android/313512.html