我有一个recyclerview,并且有带有文本,进度条和图像的列表项。
我只想在每个列表项加载器和图像中添加一个延迟,并在回收器视图中显示进度完成后显示图像,添加3秒的延迟。
这是我的适配器
body { margin: 0; }
答案 0 :(得分:0)
由于RecyclerView
的回收过程,您不能仅在ViewHolder
中使用处理程序来处理它。在这种情况下,通过滚动列表,每个itemView
都已更改并指向一个新视图,并且通过完成处理程序的延迟,它可能会更新错误的视图。因此,您应该将更新时间保留为AppListViewModel
实例中的一个字段。我的意思是您应该保留System.currentTimeInMillis() + (i + 1) * 3000
作为每一行的更新时间。然后在视图持有者类(您在其中编写了TODO
)中,将当前时间与viewModel实例中行的更新时间进行比较。如果时间结束,请更新视图。
最后,在初始化Fragment
的{{1}}(或Activity
)中,尝试每秒调用Adapter
。
您可以使用下面的类来保持每秒触发一次:
adapter.notifyDatasetChange()
用法:
private class SchedulerHandler extends Handler {
private static final long SCHEDULE_TIME = 1000;
private static final int MSG_START = 1;
private SchedulerHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_START:
// call adapter.notifyDatasetChanged()
sendEmptyMessageDelayed(MSG_START, SCHEDULE_TIME);
break;
default:
throw new IllegalArgumentException("Unknown what=" + msg.what);
}
}
void startScheduling() {
sendEmptyMessage(SchedulerHandler.MSG_START);
}
void stopScheduling() {
removeMessages(SchedulerHandler.MSG_START);
}
}
更新结束时:
SchedulerHandler schedulerHandler = new SchedulerHandler();
schedulerHandler.startScheduling();
答案 1 :(得分:0)
我通过在handler
中使用progressabar
和image
和ViewModel
的状态来完成此操作,然后将所有数据添加到Fragment中。 / p>
在将数据添加到适配器之后添加了以下行:
Message message = new Message();
message.arg1 = 0;
message.what = 0;
handler.sendMessageDelayed(message, 2000);
然后添加一个处理程序来处理消息:
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int position = msg.arg1;
appListViewModels.get(position).setProgressState("INACTIVE");
appListViewModels.get(position).setImageState("ACTIVE");
userListAdapter.notifyItemChanged(position + 1);
if (position < userListAdapter.getItemCount() - 2) {
appListViewModels.get(position + 1).setProgressState("ACTIVE");
userListAdapter.notifyItemChanged(position + 2);
}
if (position < userListAdapter.getItemCount() - 2) {
Message message = new Message();
message.arg1 = position + 1;
message.what = 0;
handler.sendMessageDelayed(message, 2000);
} else {
if (totalActivatedApps == 5) {
buttonContinue.setEnabled(true);
} else {
buttonContinue.setEnabled(false);
}
}
}
};