Android 仅装饰RecyclerView的绝对第一项

Android 仅装饰RecyclerView的绝对第一项,android,android-recyclerview,Android,Android Recyclerview,我只需要在循环视图的绝对第一项中添加分隔符 我已经读过了,我明白这一点 (onDraw)方法在屏幕上可见的RecyclerView中当前的所有子视图上循环 我的问题正是这样。由于它每次在RecycleView中的视图发生更改时都会执行,因此即使我只能定位并装饰第一个项目,只要我向下滚动,装饰就会转移到当前的第一个项目 在该链接中,选择通过方法isDecorated完成,该方法查看当前子视图持有者的实例。我的猜测是,这家伙想根据ViewHolder类型进行装饰,这不是我的问题,因为我的Recycl

我只需要在循环视图的绝对第一项中添加分隔符

我已经读过了,我明白这一点

(onDraw)方法在屏幕上可见的RecyclerView中当前的所有子视图上循环

我的问题正是这样。由于它每次在RecycleView中的视图发生更改时都会执行,因此即使我只能定位并装饰第一个项目,只要我向下滚动,装饰就会转移到当前的第一个项目

在该链接中,选择通过方法
isDecorated
完成,该方法查看当前子视图持有者的实例。我的猜测是,这家伙想根据ViewHolder类型进行装饰,这不是我的问题,因为我的RecyclerView中只有一种类型的元素

这是我的
DividerItemDecoration.java

public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    private Drawable mDivider;

    public DividerItemDecoration(Drawable divider) {
        mDivider = divider;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

    RecyclerView.ViewHolder holder = parent.getChildViewHolder(view);
        if (parent.getChildAdapterPosition(view) == 1) {
            outRect.top = outRect.top + mDivider.getIntrinsicHeight();
        }
        return;

    }

    @Override
    public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        int dividerLeft = parent.getPaddingLeft();
        int dividerRight = parent.getWidth() - parent.getPaddingRight();

        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount - 1; i++) {
            if(i==0 ){
                View child = parent.getChildAt(i);

                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

                int dividerTop = child.getBottom() + params.bottomMargin;
                int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();

                mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
                mDivider.draw(canvas);
            }
        }
    }
}
public类DividerItemDecoration扩展了RecyclerView.ItemDecoration{
专用可抽出式mDivider;
公共分隔带分隔带(可抽出式分隔带){
mDivider=分配器;
}
@凌驾
public void getItemOffsets(Rect outRect、View View、RecyclerView父级、RecyclerView.State){
super.getItemOffset(outRect、view、parent、state);
RecyclerView.ViewHolder=parent.getChildViewHolder(视图);
if(parent.getChildAdapterPosition(视图)==1){
outRect.top=outRect.top+mDivider.getIntrinsicHeight();
}
返回;
}
@凌驾
公共void onDraw(画布画布、RecyclerView父级、RecyclerView.State){
int dividerLeft=parent.getPaddingLeft();
int dividerRight=parent.getWidth()-parent.getPaddingRight();
int childCount=parent.getChildCount();
对于(int i=0;i
请考虑我已经搜索了一整天,只能找到例子,并在每个项目中添加装饰器,根据类型选择性地添加它,但没有真正解决绝对位置的问题。
还有,请不要像图书馆一样,我要学习,不要复制

您可以检查它是否是第一个元素, 下面是一个例子:

只需实现
getItemViewType()
,并处理
onCreateViewHolder()
中的viewType参数

所以你会做一些类似的事情:

@Override
public int getItemViewType(int position) {
    if (position == 0)
        return 1;
    else
        return 2;
}
然后在onCreateViewHolder中,根据您的视图类型对不同的布局进行充气

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == 1) {
        // inflate your first item layout & return that viewHolder
    } else {
        // inflate your other item layout & return that viewHolder
    }
}

您有
parent.getChildAdapterPosition()
方法,因此,只有当该方法返回1谢谢时,才在
onDraw
中绘制“分隔符”!有趣的是,我在
getItemOffset
中使用了该方法,但没有考虑在
onDraw
中重用它。不幸的是,当我切换活动(通过单击行项目)并返回时,我得到了一些奇怪的工件。分隔器稍微移动。为什么?在性能方面,通过适配器为第一项提供不同的布局是否比仅对第一项应用装饰器更好?据我所知,这种方法是最有效的方法。只是一个if/else语句,要使用相同的布局,您将对第一个元素使用不同的布局。这也是一种代码更少的方式好吧,我喜欢这个答案,我想我会用这种方式实现我的应用程序。非常感谢你!是否有任何提示可以更改从滑动中产生的(非常糟糕)动画,以关闭第一个项目,从而导致第二个项目消失(留下一个大洞),然后在应用新布局的情况下重新出现在第一个位置,同时所有其他项目都向上滚动?您可以按照本教程的说明执行滑动删除功能,工作非常好:还有:记住每次更改列表/适配器时都要调用notifyDataSetChanged()。如果你喜欢答案,请接受:)啊,是的,对不起,我分心了,差点忘了。我将查看这些链接,我的“刷卡”功能已经很好了,问题是当第一个项目被刷卡时,第二个项目将消失并重新显示为第一个项目(使用新的布局)。过渡不是很平滑,可能与RecyclerView中的动画有关。无论如何,再次非常感谢你