如何在RecyclerView中一致地向项目视图添加交替背景

时间:2015-08-14 10:08:13

标签: android android-recyclerview

到目前为止,我使用适配器onBindViewHolder根据项目的适配器位置设置交替背景。

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.itemView.setBackgroundResource(position % 2 == 0 ?
            R.color.list_item_background_alternating : R.color.list_item_background);
    ...
}

然而,当不仅仅是显示列表时,这会变得更加复杂。 例如:当我删除一个项目并调用notifyItemRemoved(index);时,RecyclerView执行一个很好的动画,项目视图就消失了。但是,取代已删除的视图不会再次受到限制(出于明显和良好的原因),因此保留了它的旧背景。这导致布局不一致,看起来很难看。当我打电话给notifyDataSetChanged();时,背景都是正确的,但我失去了动画。

当我使用SortedListSortedListAdapterCallback)时,我遇到了类似的问题。由于排序似乎发生在视图绑定后,背景是混乱的。

实施此类行为的正确/一致方式是什么?

3 个答案:

答案 0 :(得分:13)

好吧,当我在写我的问题时,我想尝试一些我认为不会起作用的东西 - 然而,确实如此。

我创建了ItemDecoration并使用它getItemOffset();来设置视图的背景:

public class BackgroundItemDecoration extends RecyclerView.ItemDecoration {

    private final int mOddBackground;
    private final int mEvenBackground;

    public BackgroundItemDecoration(@DrawableRes int oddBackground, @DrawableRes int evenBackground) {
        mOddBackground = oddBackground;
        mEvenBackground = evenBackground;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        int position = parent.getChildAdapterPosition(view);
        view.setBackgroundResource(position % 2 == 0 ? mEvenBackground : mOddBackground);
    }
}

我感到有点内疚,我正在getItemOffsets()兜售。

有没有人有更清洁/更好的解决方案?

答案 1 :(得分:2)

这是我的解决方案 itemView引用onCreateViewHolder中布局inflater的视图。

public void onBindViewHolder(MyViewHolder holder, int position){
    //alternate row color
            if(position % 2==0)
                holder.itemView.setBackgroundColor(Color.YELLOW);
            else
                holder.itemView.setBackgroundColor(Color.LTGRAY);
)

这就是你所需要的一切。希望这会有所帮助。

答案 2 :(得分:-1)

注意: - 此代码适用于Lollipop及以上测试。并填充你的构造函数get context如果为null则不为null然后它不起作用。

 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        LocationModel locationModel = locationModelArrayList.get(position);

        if(position%2==0)
        {

            holder.itemView.setBackgroundColor(ContextCompat.getColor(context,R.color.colorPrimary));
        }else
        {
           holder.itemView.setBackgroundColor(ContextCompat.getColor(context,R.color.colorPrimaryDark));

        }

    }