2017-04-14 50 views
0

我需要为我的回收视图的第一个项目添加分隔符绝对仅装饰RecyclerView的绝对第一项

我已经看过How to selectively decorate RecyclerView items,据我所知,

的(的onDraw)方法遍历所有的孩子目前在RecyclerView在屏幕上看到的景色。

和我的问题就是这样。因为每当RecycleView中的视图发生变化时,即使我只能找到并修饰第一项,只要向下滚动,装饰就会转移到当前的第一项

在该链接中,通过查看当前孩子的ViewHolder实例的方法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); 
      } 
     } 
    } 
} 

请考虑我搜索了一整天,只能找到例子和要点添加到每个项目的装饰,有选择地添加它基于类型,但没有真正解决绝对位置。 另外,请不要像https://github.com/yqritc/RecyclerView-FlexibleDivider这样的图书馆,我想学习,不要复制。

+0

你'parent.getChildAdapterPosition()'方法,所以得出你的“分水岭”内部'onDraw'只有在该方法返回1 – pskink

+0

由于这个实际工作!有趣的是,我在'getItemOffset'中使用了该方法,并没有考虑在'onDraw'中重用它。不幸的是,当我切换活动(通过点击行项目)并返回时,我收到了一些奇怪的工件。分隔器略微移动。怎么来的? – MaX

回答

-1

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

只实现getItemViewType(),并照顾viewType参数的onCreateViewHolder()

所以,你做这样的事情:

@Override 
public int getItemViewType(int position) { 
    if (position == 0) 
     return 1; 
    else 
     return 2; 
} 

然后onCreateViewHolder根据您viewType虚增您不同的布局。

@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 
    } 
} 
+0

通过适配器给第一个项目提供了一个不同的布局比在应用性能方面仅将第一个项目应用装饰器更好? – MaX

+0

对于我所学到的,这种方式是最有效的方法。只是一个if/else语句,而是使用相同的布局,您将为第一个元素使用不同的布局。这种方式也是代码较少的方式 –

+0

好的,我喜欢这个答案,我想我会以这种方式实现我的应用程序。非常感谢你!任何提示改变滑动产生的(非常糟糕的)动画以消除第一个项目,这会导致第二个项目消失(留下一个大洞),然后在第一个位置重新出现,同时所有其他项目都向上滚动? – MaX