【发布时间】:2020-05-16 20:37:45
【问题描述】:
问题是,在我的 recyclerview - 适配器中,单击删除按钮,我显示小进度条代替删除按钮。现在假设完成删除过程需要 2 分钟。因此,与此同时,如果用户正在滚动 recyclerview,正在运行的进度条交换位置。
我该如何控制?
FLOW: 点击删除 - delete.onClicklistener - 内部监听器 - 在活动中通知 - 调用异步任务 - 异步任务结果监听器是 onDeleteDataReceived - 内部调用 updateView() 这是在适配器类中 - 在 updateView() 内部更改可见性。
注意:该特定位置的项目被正确删除,但滚动回收视图时进度条位置交换
我已经检查了这个答案,但不适用于我的情况:Why does the input value in EditText swaps its position while scrolling in a RecyclerView?
代码:
适配器类:
public void updateView(int position, RecyclerView.ViewHolder viewHolder) {
try {
if (viewHolder.getAdapterPosition() == position) {
MyViewHolder holder = (MyViewHolder) viewHolder;
holder.delete.setVisibility(View.VISIBLE);
holder.progressBar.setVisibility(View.GONE);
notifyItemRemoved(position);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
Events events = eventList.get(position);
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
holder.delete.setVisibility(View.GONE);
holder.progressBar.setVisibility(View.VISIBLE);
eventList.get(position).isSelected = true;
listener.onClicked(position, eventList.get(position).getEventId());
}
}
});
活动:
@Override
public void onDeleteDataReceived(Boolean status, int position) {
stopShimmerLayout();
if (status) {
try {
if (eventsList.get(position).isSelected) {
eventsList.remove(position);
RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(position);
mAdapter.updateView(position, viewHolder);
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
showToast(context, "Failed", Toast.LENGTH_SHORT);
}
}
观看视频以获得更好的理解:https://drive.google.com/open?id=13ZAtnyfGbi2X4JjUTmJsIDy-gt5y51Gr
实现:https://drive.google.com/open?id=1ePOfZctEO_IhzUM3bFYW3VJKThoVkI6a
这是什么? 为什么每个人都在说同样的事情?我要问的是一切正常。我能够显示正确位置的进度条和删除按钮可见性,并且项目也被用户选择的位置正确删除。问题是在删除时,如果我开始非常快地滚动,那么运行进度条会交换位置。但是当我再次到达那个位置时,那个项目被删除了。
【问题讨论】:
-
我看到了,问题是你在
ViewHolder类中而不是在成员函数onBindViewHolder中这样做。因为MyViewHolder总是将整个布局表示为一个,而onBindViewHolder()表示RecyclerView中每个项目的布局,所以当您在MyViewHolder中执行此操作时,它会更改每个项目的视图。因此,使用onBindViewHolder(holder: MyViewHolder, position: Int)并使用此holder将特定项目的ProgressBar引用为holder.progressBar.setVisibility(View.VISIBLE);。 -
@LalitFauzdar 我已经试过了。查看更新的问题。但问题还是一样。这又是一个问题:stackoverflow.com/questions/61842770/…
-
@LalitFauzdar 观看视频以获得更好的理解:drive.google.com/open?id=13ZAtnyfGbi2X4JjUTmJsIDy-gt5y51Gr
-
@LalitFauzdar 我检查了两个答案。你能告诉我,我可以用不同的方法在不同的不同情况下以两种方式使用相同的侦听器吗?就像我创建监听器 A 并在这两个方法中,X 和 Y.,我可以在单击删除按钮时这样做吗?我将使用 X 方法将数据从适配器传递到活动,删除后我将使用 Y 将数据从活动传递到适配器。有可能吗?
标签: android