在recyclerview中为特定列表项添加处理程序

时间:2018-12-22 18:01:36

标签: android android-recyclerview recycler-adapter

我有一个recyclerview,并且有带有文本,进度条和图像的列表项。

我只想在每个列表项加载器和图像中添加一个延迟,并在回收器视图中显示进度完成后显示图像,添加3秒的延迟。

这是我的适配器

body { margin: 0; }

加载器应继续移动,并且3秒钟的延迟和图像更改后,其可见性将一一变得不可见。请参阅图片以获取更多描述 see image

2 个答案:

答案 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中使用progressabarimageViewModel的状态来完成此操作,然后将所有数据添加到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);
            }
        }

    }
};