使用RecyclerView時(shí)需要將選中的item在View中居中顯示,RecyclerView的scrollToPosition(position)方法只會(huì)將position所對(duì)應(yīng)的item滾動(dòng)到屏幕中顯示,但是不會(huì)講item居中;scrollToPosition(position)方法調(diào)用后有三種情況:
1.position對(duì)應(yīng)的item在第一個(gè)可見item之前
最后會(huì)將item顯示在RecyclerView的頂部
2.position對(duì)應(yīng)的item在最后一個(gè)可見item之后
最后會(huì)將item顯示在RecyclerView的底部
3.position對(duì)應(yīng)的item已經(jīng)可見
沒有任何效果
如果我們需要將position對(duì)應(yīng)的item居中顯示怎么辦?
上面的3種情況說明,直接使用scrollToPosition(position)是不行的,但是可以算出position的offset(偏移量)來使item居中顯示,偏移量計(jì)算如下:
public int computePositionOffset(int position) {
int offsetPosition = 0;
int firstPosition = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
int lastPosition = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
//獲取firstPosition,lastPosition的第二種方法
// LinearLayoutManager manager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
// int firstPosition = manager.findFirstVisibleItemPosition();
// int lastPosition = manager.findLastVisibleItemPosition();
//最大的position
int maxPosition = myAdapter.getItemCount() - 1;
//position的偏移量
int offset = (lastPosition - firstPosition) / 2;
if (firstPosition > position) { //第一種情況
offsetPosition = position - offset;
} else if (lastPosition < position) { //第二種情況
offsetPosition = position + offset;
} else { //第三種情況
if (lastPosition - position > position - firstPosition) {//第三種情況中position在中心點(diǎn)偏上
offsetPosition = position - offset;
} else {//第三種情況中position在中心點(diǎn)偏下
offsetPosition = position + offset;
}
}
//偏移過的offsetPosition越界
if (offsetPosition < 0) {
offsetPosition = 0;
} else if (offsetPosition > maxPosition) {
offsetPosition = maxPosition;
}
return offsetPosition;
}
使用偏移后的offsetPosition可以將目標(biāo)position居中顯示。
以上計(jì)算偏移量的方法有個(gè)問題
firstPosition,lastPosition在RecyclerView還沒有將itemView顯示之前,獲取到的值是-1,這樣會(huì)導(dǎo)致計(jì)算的偏移量不正確。
添加一個(gè)解決辦法,該解決辦法在一定程度下可用,但是局限性較大
LinearLayoutManager manager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
int firstPosition = manager.findFirstVisibleItemPosition();
int lastPosition = manager.findLastVisibleItemPosition();
//當(dāng)獲取到的firstPosition,lastPosition無效的時(shí)候,我們可以當(dāng)做RecyclerView是從第0個(gè)item開始顯示
if (firstPosition < 0){
firstPosition = 0;
}
if (lastPosition < 1){
lastPosition = maxItemCounts;//maxItemCounts為RecyclerView在屏幕中從第0個(gè)item開始,能顯示多少個(gè)item;
/*
*比如一個(gè)比較簡(jiǎn)單且特殊的情況:
*已知RecyclerView的高度,
*所有item高度一致且已知item高度的情況下,
*maxItemCounts = Math.ceil(RecyclerViewHeight / itemHeight)
*/
}
這個(gè)方法局限性比較大,遇到以下的情況也沒用,比如: