今天我有一個很奇怪的問題:我有一個RecyclerView,水平顯示一些縮略圖,我用smoothScrollToPosition
導航到我需要的項目,但我注意到一個問題:它會不滾動到最後一個項目。經過進一步的調試,我發現我的回收站的兒童數量比顯示的少!我看到五個項目,每次顯示三個項目。但兒童數(得到recyclerView.getChildCount
)返回4而不是5,我不能得到getChildAt(4)
最後一個孩子。更怪,adapter.getItemCount()
回報5,和recyclerView.getAdapter().getItemCount()
回報5 ...RecyclerView兒童數量少於兒童人數
在檢查,recyclerView.getLayoutManager().getItemCount()
回報5,和'recyclerView..getLayoutManager()。getChildCount()返回4 ...
我需要兩件東西:首先,我需要我的recyclerView滾動到最後一個項目,第二:我需要能夠獲取所有孩子,因爲我在用戶與項目進行交互時對其進行了一些修改。
一些代碼:
// Scrolling and editing the item inside the recyclerView
// It doesn't scroll to position 4, even having a item there...
mLayoutManager.smoothScrollToPosition(recyclerView, null, position);
// the code bellow returns null if position = 4, even if the recyclerView adapter has a item at index 4, and it is visible...
ImageView iv = (ImageView) recyclerView.getChildAt(position);
if (iv != null) {
iv.setPadding(10, 10, 10, 10);
iv.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
ImageView ivo = (ImageView) recyclerView.getChildAt(position - 1);
if (position - 1 == 0) {
ivo.setPadding(10, 10, 10, 10);
} else {
ivo.setPadding(0, 10, 10, 10);
}
ivo.setBackgroundColor(getResources().getColor(R.color.transparent));
}
smoothScrollToPosition實現:
public class SnappingLinearLayoutManager extends LinearLayoutManager {
private static final float MILLISECONDS_PER_INCH = 150f;
public SnappingLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
int position) {
RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext()){
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return new PointF(0, 1);
}
//This returns the milliseconds it takes to scroll one pixel.
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH/displayMetrics.densityDpi;
}
};
smoothScroller.setTargetPosition(position);
startSmoothScroll(smoothScroller);
}
private class TopSnappedSmoothScroller extends LinearSmoothScroller {
public TopSnappedSmoothScroller(Context context) {
super(context);
}
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return SnappingLinearLayoutManager.this
.computeScrollVectorForPosition(targetPosition);
}
@Override
protected int getVerticalSnapPreference() {
return SNAP_TO_ANY;
}
}
}
RecycleView不包含適配器中的所有項目。它只能顯示視圖的視圖+在回收站視圖列表的開始和結尾處有一些額外的視圖,因此它可以使其更快。也許這是問題所在。 – Rafal