android 向上展开列表,android – 在回滚视图滚动/向上滚动时展开appbarlayout

您可以使用

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值