Instagram のフィルター レイアウトの仕組みに似たレイアウトを作成しようとしています。基本的に、フィルターを選択すると、選択した項目までスクロールして + 1 表示され、さらにフィルターがあることが示されます。
私は現在、ここでLinearLayoutManager
水平方向のカスタムを構築しようとしてRecyclerView
います:
public class LinearLayoutSnapManager extends LinearLayoutManager {
private int mCurrentPos = 0;
public LinearLayoutSnapManager(Context context) {
super(context);
}
public LinearLayoutSnapManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public LinearLayoutSnapManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void snap(RecyclerView rv, int position) {
if (mCurrentPos == position) {
// No move
return;
}
boolean goingRight = true;
if (position < mCurrentPos) {
goingRight = false;
}
mCurrentPos = position;
smoothScrollToPosition(rv, new RecyclerView.State(), goingRight ? getScrollRightPos(): getScrollLeftPos());
}
private int getScrollLeftPos() {
int newPos = mCurrentPos - 1;
return (newPos > 0) ? newPos : 0;
}
private int getScrollRightPos() {
return mCurrentPos + 1;
}
}
左にスクロールすると意図したとおりに機能しますが、右にスクロールすると、newItem + 1 に対してリストの最後にジャンプするように見え、なぜそれが起こるのかわかりません。