【问题标题】:onChildDraw causes the item to flashonChildDraw 使项目闪烁
【发布时间】:2016-10-28 18:10:03
【问题描述】:

我正在尝试创建一个可以滑动关闭的视图,但它可以撤消。这些项目在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 参数调用。点击该项目会在一瞬间显示背景视图,然后可以正常关闭前景。我该如何解决这个问题?

【问题讨论】:

  • 你的问题解决了吗?
  • 我已经添加了答案

标签: android android-recyclerview itemtouchhelper


【解决方案1】:

解决方案是使用ItemTouchHelper.CallbackgetDefaultUIUtil()function。工作代码如下:

@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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多