当前位置: 首页 > 知识库问答 >
问题:

Android ItemTouchHelper.SimpleCallback获取滑动方向

冷宏茂
2023-03-14

我已经实现了swipe以将其删除到我的RecycerView中。它触发2个功能(编辑记录和删除)。如果你向左滑动,你编辑它,如果向右滑动,你删除它。我在RecycerView项的一般部分下有这样的布局

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fe5722">

    <ImageView
        android:id="@+id/edit_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        android:layout_marginStart="24dp"
        android:src="@mipmap/ic_mode_edit_white_24dp" />

    <ImageView
        android:id="@+id/delete_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="24dp"
        android:src="@mipmap/ic_delete_white_24dp" />
</RelativeLayout>
public class RecyclerItemTouchHelper extends ItemTouchHelper.SimpleCallback {
private RecyclerItemTouchHelperListener listener;
private ImageView imageView;

public RecyclerItemTouchHelper(int dragDirs, int swipeDirs, RecyclerItemTouchHelperListener listener) {
    super(dragDirs, swipeDirs);
    this.listener = listener;
}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    return true;
}


@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    if (viewHolder != null) {
        final View foregroundView = ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).getLayout();
        getDefaultUIUtil().onSelected(foregroundView);
    }
}

@Override
public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
                            RecyclerView.ViewHolder viewHolder, float dX, float dY,
                            int actionState, boolean isCurrentlyActive) {
    final View foregroundView = ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).getLayout();
    getDefaultUIUtil().onDrawOver(c, recyclerView, foregroundView, dX, dY,
            actionState, isCurrentlyActive);
}

@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    final View foregroundView = ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).getLayout();
    getDefaultUIUtil().clearView(foregroundView);
}

@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
                        RecyclerView.ViewHolder viewHolder, float dX, float dY,
                        int actionState, boolean isCurrentlyActive) {
    ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).setEditIconInvisible();
    final View foregroundView = ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).getLayout();

    getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY,
            actionState, isCurrentlyActive);
}

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

    return super.getSwipeDirs(recyclerView, viewHolder);
}

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

@Override
public int convertToAbsoluteDirection(int flags, int layoutDirection) {
    if(layoutDirection == ItemTouchHelper.LEFT){
        Log.d("myLogs", "Налево пошло");
    }
    return super.convertToAbsoluteDirection(flags, layoutDirection);
}

public interface RecyclerItemTouchHelperListener {
    void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position);
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
                        RecyclerView.ViewHolder viewHolder, float dX, float dY,
                        int actionState, boolean isCurrentlyActive) {
    final View foregroundView = ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).getLayout();
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        if (dX > 0) {
            ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).getEditIcon().setVisibility(View.VISIBLE);
            ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).getDeleteIcon().setVisibility(View.GONE);
        } else {
            ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).getEditIcon().setVisibility(View.GONE);
            ((PasswordRecyclerViewAdapter.ViewHolder) viewHolder).getDeleteIcon().setVisibility(View.VISIBLE);
        }
    }

    getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY,
            actionState, isCurrentlyActive);
}

共有1个答案

施自明
2023-03-14

ItemTouchHelper.callback有一个公共方法onChildDraw(),该方法将在每个具有DX值的帧上调用。此值是由于用户正在执行的当前滑动操作而导致的视图的水平平移。

您可以使用dx的值(以及以前为零时它现在是正值,以前为零时它现在是负值)来检测用户是从左向右还是从右向左滑动。

private class MyItemTouchCallback extends ItemTouchHelper.Callback {

    private float previousDx = 0;

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        ...
        previousDx = 0;
    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        if (previousDx <= 0 && dX > 0) {
            // swiping from left to right
        }
        else if (previousDx >= 0 && dX < 0) {
            // swiping from right to left
        }

        ...

        previousDx = dX;
    }
}
 类似资料:
  • 问题内容: 这两种方法以及的两种方法都不会告诉您滑动的方向。 该方法的的委托不帮助我们,所以尽管。它只是告诉页面是否被完全刷了。 那么我应该使用哪种方法来准确地检测用户方向(左或右)? 这两个属性可能会有所帮助: 我的代码如下所示: 根据pbasdf所说, 问题答案: 您应该同时使用和委托方法来确定转换是向前还是向后。在课程开始时声明几个索引变量,例如和(均为)。 在该方法中,将等于挂起的视图控制

  • 本文向大家介绍iOS滑动解锁、滑动获取验证码效果的实现代码,包括了iOS滑动解锁、滑动获取验证码效果的实现代码的使用技巧和注意事项,需要的朋友参考一下  最近短信服务商要求公司的app在获取短信验证码时加上校验码,目前比较流行的是采用类似滑动解锁的方式,我们公司采取的就是这种方式,设计图如下所示: 这里校验内部的处理逻辑不作介绍,主要分享一下界面效果的实现, 下面贴出代码: 先子类化UISlide

  • 我有一个扩展SimpleOnPageChangeListener的类,在我的onPageScrollStateChanged方法中,我希望能够确定用户是否通过ViewPager向前或向后滑动。一、 e.是否从左向右或从右向左滑动。 我在谷歌上搜索了很多,但找不到任何相关信息。我原以为onPageScrollStateChanged方法会提供一个参数,说明刷卡的方向,但事实并非如此。 有人有什么想法

  • 问题内容: 我所看到的和jQuery的。左右滑动的功能/方式如何? 问题答案: 您可以使用jQueryUI中的其他效果来执行此操作: 快速示例:

  • 本文向大家介绍微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码,包括了微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码的使用技巧和注意事项,需要的朋友参考一下  微信小程序 滑动方式 竖向滑动: 横向滑动: 水平滚动 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 本文向大家介绍jQuery控制的不同方向的滑动(向左、向右滑动等),包括了jQuery控制的不同方向的滑动(向左、向右滑动等)的使用技巧和注意事项,需要的朋友参考一下 引入jquery.js,复制以下代码,即可运行。 1、slidetoggle() 交替slidedown(),slideup() Html代码 Js代码 2、左侧横向交替滑动 Animate Left Html代码 Js代码 3、左