onChildDraw使项目闪烁



我试图创建一个视图,可以滑动以解散,但它可以撤消。项目有一个背景和前景内的FrameView。我在ItemTouchHelper.Callback中重写onChildDraw,像这样:

@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                        float dX, float dY, int actionState, boolean isCurrentlyActive) {
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        if (viewHolder instanceof ItemViewHolder) {
            ItemViewHolder holder = (ItemViewHolder) viewHolder;
            holder.foreground.setTranslationX(dX);
        }
    } else {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }
}

一切正常,直到我尝试撤销基于用户操作的滑动动作,像这样:

foreground.animate()
          .translationX(0)
          .setDuration(150);

确实把实际视图带回到它的位置,但是如果用户试图再次滑动那个项目,背景再次显示,并且由于某种原因onChildDraw被调用,dX参数大于屏幕的宽度。点击该项目将显示背景视图一秒钟,然后前景通常可以取消。我该如何解决这个问题?

解决方法是使用ItemTouchHelper.CallbackgetDefaultUIUtil()函数。工作代码如下:

@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                        float dX, float dY, int actionState, boolean isCurrentlyActive) {
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        if (viewHolder instanceof TrackerListAdapter.ItemViewHolder) {
            TrackerListAdapter.ItemViewHolder holder =
                    (TrackerListAdapter.ItemViewHolder) viewHolder;
            getDefaultUIUtil().onDraw(c, recyclerView, holder.foreground, dX, dY, actionState, isCurrentlyActive);
        }
    } else {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }
}

最新更新