gpt4 book ai didi

android - LinearSnapHelper 不会捕捉到 RecyclerView 的边缘项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:03:01 24 4
gpt4 key购买 nike

这是我之前 question 的后续.

在我的应用程序中,我试图让水平 RecyclerView 自动捕捉到中心项目。为此,我附加了一个 LinearSnapHelper。我还创建了一个项目装饰,它向第一个/最后一个元素添加了一些左/右填充:

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;
}
}

问题是,当第一次填充 RecyclerView 时,第一个项目在屏幕中居中并且也被选中,但是当我尝试水平滚动时,我返回到第一个项目,我可以选择的最左边的项目是第二个(位置 1)。最后一项也是如此,可以捕捉到的最右边的项目是倒数第二个。 (state.getItemCount() - 2)。

我需要实现新的 SnapHelper 还是我做错了什么?

最佳答案

RecyclerView 有自己的 ItemDecoration 规则。他将它们视为项目本身的一部分。你可以想,你的 decoration(即使它只是一个 padding)是你的 my_item.xml 本身的一部分。

LinearSnapHelper 使用类似 LayoutManager.getDecoratedMeasuredWidth() 的方法来确定 View 的中心。这就是问题发生的地方。它看到您的第一个项目比您想象的要大得多,因此第一个 View 的中心实际上位于 (padding + view.getWidth())/2 中。它比第二个 View 的中心远得多,这是正常的 view.getX() + view.getWidth()/2

关于android - LinearSnapHelper 不会捕捉到 RecyclerView 的边缘项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44766186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com