到目前为止,我使用适配器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();
时,背景都是正确的,但我失去了动画。
当我使用SortedList
(SortedListAdapterCallback
)时,我遇到了类似的问题。由于排序似乎发生在视图绑定后,背景是混乱的。
实施此类行为的正确/一致方式是什么?
答案 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));
}
}