これは以前のquestionのフォローアップです。LinearSnapHelperはRecyclerViewのエッジ項目にスナップしません
私のアプリでは、水平のRecyclerView
を中央のアイテムに自動的にスナップするようにしています。そうするために、私はLinearSnapHelper
を添付しました。 RecyclerView
が最初に読み込まれるとき
public class OffsetItemDecoration extends RecyclerView.ItemDecoration {
private Context ctx;
public OffsetItemDecoration(Context ctx){
this.ctx = ctx;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int nCols = ActivityUtils.getNumCols(ctx);
int colWidth = (int)(getScreenWidth()/(float)(nCols));
if(parent.getChildAdapterPosition(view) == 0){
int offset = Math.round(getScreenWidth()/2f - colWidth/2f);
setupOutRect(outRect, offset, true);
}
else if (parent.getChildAdapterPosition(view) == state.getItemCount()-1){
int offset = Math.round(getScreenWidth()/2f - colWidth/2f);
setupOutRect(outRect, offset, false);
}
}
private void setupOutRect(Rect rect, int offset, boolean start){
if(start) rect.left = offset;
else rect.right = offset;
}
private int getScreenWidth(){
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
return size.x;
}
}
問題は、最初の項目が画面の中央に配置されていること:私も最初/最後の要素にいくつかの左/右のパディングを追加した項目の装飾を作成しましたまた選択されていますが、水平方向にスクロールして最初の項目に戻ると、選択できる最も左の項目は2番目の項目(位置1
)です。最後のアイテムについても同じことが起こります。スナップできる最後のアイテムは最後から2番目です。 (state.getItemCount() - 2
)。
新しいSnapHelper
を実装する必要がありますか、何か間違っていますか?
これは、listViewの長さのためです。最初と最後の項目には到達できません。私は同様の問題を抱えており、到達不可能な領域を補うためにデフォルトの不可視の項目を追加しました。しかし、このためには、画面サイズごとに計算を行う必要があります。しかし、これはちょっとしたハックな解決策です。もっと良い解決策があるのかもしれません。(ほしいですが) – Opiatefuchs
@Opiatefuchs理論的には、私の「ItemDecoration」によって追加された人為的なオフセットが、このようなダミーアイテムを作成できないようにしてください。 – Vektor88
はい....理論的には....私はオフセットでどんな成功もしていませんでした。しかし、これは私の必要性のために作られていませんでした。私の目標は、アイテムを左から右に(そしてその逆に)画面の端にスライドさせるhorizontal recyclerViewを持つことでした。オフセットはエッジをカットし、アイテムは画面の最後までスクロールしません。その問題のために、別の解決策が見つかるまで、私は不可視のビューをいくつか追加することにしました。 – Opiatefuchs