到目前为止,我使用适配器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);
...
}
Run Code Online (Sandbox Code Playgroud)
然而,当做的不仅仅是显示列表时,这会变得更加复杂.例如:当我删除的项目,并调用notifyItemRemoved(index);了RecyclerView做一个漂亮的动画和项目视图中消失了.但是,取代已删除的视图不会再次受到约束(出于明显和充分的理由),因此保留了它的旧背景.这导致布局不一致,看起来很难看.当我打电话notifyDataSetChanged();的背景都是正确的,但我失去了动画.
当我使用SortedList(带有a SortedListAdapterCallback)时,我遇到了类似的问题.由于排序似乎发生在视图绑定后,背景是混乱的.
实施此类行为的正确/一致方式是什么?
好吧,我们实现了一个MVP层,用于演示并使用RxJava和RxAndroid.我们以此为例,并以此为基础.
当调用Presenter开始执行时,它Subscriber会向Model Interactor 提交a .Interactor创建Observable和设置observeOn(Schedulers.io())和subscribeOn(AndroidSchedulers.mainThread()).那种方式(我们认为)当调用回到Subscriber(在Presenter中)时,每个调用都将在UI线程上.在Subscriber我们将数据绑定到视图.但是,这提出了一个CalledFromWrongThreadException:
07-28 09:12:48.844 17424 17566 AndroidRuntime E FATAL EXCEPTION: RxCachedThreadScheduler-1
07-28 09:12:48.844 17424 17566 AndroidRuntime E Process: [PACKAGE NAME], PID: 17424
07-28 09:12:48.844 17424 17566 AndroidRuntime E java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
07-28 09:12:48.844 17424 17566 AndroidRuntime E at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
07-28 09:12:48.844 17424 17566 AndroidRuntime E at java.util.concurrent.FutureTask.run(FutureTask.java:237)
07-28 09:12:48.844 …Run Code Online (Sandbox Code Playgroud)