先看下效果图,有波浪纹的是我点击的~~~:
可以看到,我点击之后,慢慢滑倒顶部了。上面是用的一个 RecyclerView 的控件实现的多种布局。
好了不说废话了,实现比较简单,直接看关键代码吧(不是完整代码,完整代码去下载,下面有链接):
//目标项是否在最后一个可见项之后
private boolean mShouldScroll;
//记录目标项位置
private int mToPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//滑动监听
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (mShouldScroll && RecyclerView.SCROLL_STATE_IDLE == newState) {
mShouldScroll = false;
smoothMoveToPosition(recyclerView, mToPosition);
}
}
});
//item点击事件,滑动到指定item
adapter.setmOnItemClickListerer(new MainAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
if (position != -1) {
smoothMoveToPosition(recyclerView, position);
}
}
});
}
/**
* 滑动到指定位置
*/
private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) {
// 第一个可见位置
int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
// 最后一个可见位置
int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
if (position < firstItem) {
// 第一种可能:跳转位置在第一个可见位置之前
mRecyclerView.smoothScrollToPosition(position);
} else if (position <= lastItem) {
// 第二种可能:跳转位置在第一个可见位置之后
int movePosition = position - firstItem;
if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
int top = mRecyclerView.getChildAt(movePosition).getTop();
mRecyclerView.smoothScrollBy(0, top);
}
} else {
// 第三种可能:跳转位置在最后可见项之后
mRecyclerView.smoothScrollToPosition(position);
mToPosition = position;
mShouldScroll = true;
}
}
不想说为什么了,复制过去用吧~~
CSDN 下载地址:https://download.csdn.net/download/wuqingsen1/10810684
GitHub 下载地址:https://github.com/wuqingsen/RecyclerViewTop