gpt4 book ai didi

android - RecyclerView ItemTouchHelper 滑动移除动画

转载 作者:可可西里 更新时间:2023-11-01 18:47:55 28 4
gpt4 key购买 nike

我有一个滑动删除,它绘制背景(很像收件箱应用程序),由 ItemTouchHelper 实现 - 通过覆盖 onChilDraw 方法并在提供的 Canvas 上绘制一个矩形:

    ItemTouchHelper mIth = new ItemTouchHelper(
new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {

public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
remove(viewHolder.getAdapterPosition());
}

public boolean onMove(RecyclerView recyclerview, RecyclerView.ViewHolder v, RecyclerView.ViewHolder target) {
return false;
}

@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

View itemView = viewHolder.itemView;

Drawable d = ContextCompat.getDrawable(context, R.drawable.bg_swipe_item_right);
d.setBounds(itemView.getLeft(), itemView.getTop(), (int) dX, itemView.getBottom());
d.draw(c);

super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
});

上面调用的remove方法在Adapter中:

    public void remove(int position) {
items.remove(position);
notifyItemRemoved(position);
}

背景绘制得很好,但是当调用 notifyItemRemoved 时(根据 Debugger 先生的说法),RecyclerView 首先删除了我漂亮的绿色背景,然后将两个相邻的项目推到一起。

enter image description here enter image description here

我希望它在执行此操作时将背景保留在那里(就像收件箱应用程序一样)。有什么办法吗?

最佳答案

我有同样的问题,我不想引入一个新的库来修复它。 RecyclerView 没有删除漂亮的绿色背景,它只是重新绘制自己,而您的 ItemTouchHelper 不再绘制。实际上它正在绘制,但 dX 为 0,并且正在从 itemView.getLeft()(即 0)绘制到 dX(即 0 ) 所以你什么也看不到。它画得太多了,但我稍后会回来。

无论如何在行动画时回到后台:我无法在 ItemTouchHelperonChildDraw 中执行此操作。最后我不得不添加另一个项目装饰器来完成它。它遵循以下原则:

public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (parent.getItemAnimator().isRunning()) {
// find first child with translationY > 0
// draw from it's top to translationY whatever you want

int top = 0;
int bottom = 0;

int childCount = parent.getLayoutManager().getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getLayoutManager().getChildAt(i);
if (child.getTranslationY() != 0) {
top = child.getTop();
bottom = top + (int) child.getTranslationY();
break;
}
}

// draw whatever you want

super.onDraw(c, parent, state);
}
}

此代码只考虑动画向上的行,但您还应该考虑向下的行。如果您滑动删除最后一行,就会发生这种情况,上面的行将向下移动到该空间。

当我说您的 ItemTouchHelper 绘制过多时,我的意思是:看起来 ItemTouchHelper 保留已删除行的 ViewHolder,以备需要恢复时使用。除了被刷过的 VH 之外,它还会为那些 VH 调用 onChildDraw。不确定此行为对内存管理的影响,但我需要在 onChildDraw 的开头进行额外检查,以避免绘制“fantom”行。

if (viewHolder.getAdapterPosition() == -1) {
return;
}

在您的情况下,它是从 left=0 到 right=0 绘制的,因此您什么都看不到,但开销在那里。如果您开始看到之前划掉的行绘制了背景,这就是原因。

编辑:我试了一下,看这个blog post还有这个github repo .

关于android - RecyclerView ItemTouchHelper 滑动移除动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31418905/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com