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

回收查看项TouchHelper滑动撤消

顾光明
2023-03-14

我是显示隐藏的视图后,刷了两个按钮“删除”和“取消”。在我的xml项目行中,我有2个内部关系

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:paddingTop="10dp">

<include
    android:id="@+id/item_container"
    layout="@layout/layout_back" />

<RelativeLayout
    android:id="@+id/front"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/quest_background_blue"
    android:orientation="horizontal"
    android:tag="front"
    android:focusableInTouchMode="true">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_gravity="center_vertical"
        android:padding="8dp" />

    <include
        android:id="@+id/contprice"
        style="@style/wrap"
        layout="@layout/quest_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

    <LinearLayout
        style="@style/wrap.linear"
        android:layout_gravity="center_vertical"
        android:layout_toLeftOf="@id/contprice"
        android:layout_toRightOf="@id/icon"
        android:layout_weight="0.4">

        <TextView
            android:id="@+id/title"
            style="@style/quest_title"
            android:text="Рассказать друзьям" />

        <TextView
            android:id="@+id/details"
            style="@style/quest_detail" />
    </LinearLayout>
</RelativeLayout>

</FrameLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerVertical="true"
            android:background="@android:color/transparent">
<TextView
    android:id="@+id/cancel"
    android:textColor="#0eb0a0"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_alignParentRight="true"
    android:clickable="true"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:gravity="center"
    android:padding="10dp"
    android:text="Отмена"
    android:textStyle="bold"/>

<TextView
    android:id="@+id/delete"
    android:textColor="#e6007e"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:clickable="true"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:gravity="center"
    android:padding="10dp"
    android:text="Скрыть"
    android:textStyle="bold"/>
</RelativeLayout>

此处ItemTouchHelper实现

public class MyItemTouchHelper extends ItemTouchHelper.SimpleCallback {

private ItemAdapter itemAdapter;
private RecyclerView recyclerView;

public MyItemTouchHelper(RecyclerView mRecyclerView, ItemAdapter itemAdapter) {
    super(0, ItemTouchHelper.START | ItemTouchHelper.END);
    this.itemAdapter = itemAdapter;
    this.recyclerView = mRecyclerView;
}

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

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
    return makeMovementFlags(0, swipeFlags);
}

@Override
public boolean isItemViewSwipeEnabled() {
    return true;
}

@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
    Log.d("SWIPE", " direction = " + direction);
    final ItemAdapter.ItemViewHolder holder = (ItemAdapter.ItemViewHolder) viewHolder;
    holder.itemView.setOnClickListener(null);
    ((ItemAdapter.ItemViewHolder) viewHolder).itemContainer.bringToFront();
    ((ItemAdapter.ItemViewHolder) viewHolder).itemContainer.invalidate();
    ((ItemAdapter.ItemViewHolder) viewHolder).itemCancel.setEnabled(true);
    ((ItemAdapter.ItemViewHolder) viewHolder).itemDelete.setEnabled(true);
    ((ItemAdapter.ItemViewHolder) viewHolder).itemContainer.setVisibility(View.VISIBLE);

    ((ItemAdapter.ItemViewHolder) viewHolder).itemDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "DELETE " + viewHolder.getAdapterPosition(), Toast.LENGTH_SHORT).show();
            itemAdapter.removeItem(viewHolder.getAdapterPosition());
            recyclerView.getAdapter().notifyItemRemoved(viewHolder.getAdapterPosition());
        }
    });
    ((ItemAdapter.ItemViewHolder) viewHolder).itemCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "CANCEL " + viewHolder.getAdapterPosition(), Toast.LENGTH_SHORT).show();
            ((ItemAdapter.ItemViewHolder) viewHolder).itemContainer.setVisibility(View.INVISIBLE);
            holder.itemView.setOnClickListener(ItemAdapter.itemAdapterClickListener(viewHolder.getAdapterPosition()));
            recyclerView.getAdapter().notifyItemChanged(viewHolder.getAdapterPosition());
            clearView(recyclerView, viewHolder);
            ((ItemAdapter.ItemViewHolder) viewHolder).itemCancel.setEnabled(false);
            ((ItemAdapter.ItemViewHolder) viewHolder).itemDelete.setEnabled(false);
            ((ItemAdapter.ItemViewHolder) viewHolder).itemContext.setVisibility(View.VISIBLE);
            ((ItemAdapter.ItemViewHolder) viewHolder).itemContext.bringToFront();
            ((ItemAdapter.ItemViewHolder) viewHolder).itemContext.invalidate();
        }
    });
}


@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    if (viewHolder.getAdapterPosition() == -1) {
        return;
    }

    ItemAdapter.ItemViewHolder holder = (ItemAdapter.ItemViewHolder) viewHolder;
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        if (dX > 0 || dX < 0) {
            holder.itemContext.setTranslationX(dX);

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


@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    super.clearView(recyclerView, viewHolder);
    View foreground = ((ItemAdapter.ItemViewHolder) viewHolder).getSwipableView();
    getDefaultUIUtil().clearView(foreground);
}
}

这里是观众

 public class ItemViewHolder extends RecyclerView.ViewHolder {

    TextView itemText;
    RelativeLayout itemContainer;
    RelativeLayout itemContext;
    TextView itemDelete;
    TextView itemCancel;

    public ItemViewHolder(View itemView) {
        super(itemView);
        itemText = (TextView) itemView.findViewById(R.id.details);
        itemDelete = (TextView) itemView.findViewById(R.id.delete);
        itemCancel = (TextView) itemView.findViewById(R.id.cancel);
        itemContainer = (RelativeLayout) itemView.findViewById(R.id.item_container);
        itemContext = (RelativeLayout) itemView.findViewById(R.id.front);

    }

    public ViewGroup getSwipableView() {
        return itemContext;
    }

    public ViewGroup getItemContainer() {
        return itemContainer;
    }
}

如果单击be more correct buttons但未在swipe后首次尝试更新,则在swipe模式下单击项目,并且日志显示前3次单击是swipe方向
在swipe log.d(“swipe”,“direction=”+direction);

D/SWIPE:  direction = 16
D/SWIPE:  direction = 16
D/SWIPE:  direction = 16

共有1个答案

那安宁
2023-03-14

ItemViewWholder中更改此

item_container = itemView.findViewById(R.id.item_container);
itemDelete = (TextView) item_container.findViewById(R.id.delete);
itemCancel = (TextView) item_container.findViewById(R.id.cancel);

添加

View item_container;
 类似资料:
  • 我正试图开发一个类似Gmail的功能,你可以滑动删除。这是我的回收器视图的主要片段。 这是我的助手 现在滑动recyclerview项目,并不是每次都调用onSwiped方法。我完全刷了这个项目。 编辑:添加的任何新项目都会成功删除,但已添加的项目不会被删除。 编辑2:适配器 感谢任何帮助。提前感谢。

  • 假设我单击2位置的项目(记住其布局是颠倒的),然后调用 通知项目已更改(2[位置]) 在onBindViewHolder中,我在单击的项目上显示一些视图,因此它的高度会发生变化,当RecyclView测量它的孩子时,它会意识到它应该移动一些项目以使该项目的高度变化看起来引人入胜))。DefaultItemAnimator会处理它,但它会将所有低于“U are??? Omg谢谢u”项目的孩子向下移动

  • 我正在从事一个自由职业者的android项目。我有一个问题,就是根据项目设计需要改变RecyclerView项目之间的利润率。我想显示屏幕上最后一个可见项目的一半,这样用户就可以猜测水平滚动。我尝试创建一个自定义的RecyclerView.itemEdition。当屏幕第一次打开时,一切正常,但当我开始在这个回收视图上水平滚动时,项目之间的间隔增加了,有时甚至减少了。我如何用一般方法解决这个问题。

  • 所以,这就是我的问题。我的recyclerview项目在底部有一个视图,我最初将其设置为消失。现在,当它们被点击时,我想让它们再次可见。所以在onClick方法中,我将视图设置为Visible。一切正常,但是当我向下滚动和向上滚动时,视图又隐藏了。我想这和取景模式有关。我想保持现状,即开放。我该怎么做?谢了。 视图支架: 点击: 编辑:上传的代码。此外,我尝试在onClick中更新Item的布尔值

  • 我正在尝试使回收器视图中的cardview展开。我让扩展部分正常工作,但是当向其添加过渡时,开始出现一些视觉错误。当没有屏幕外项目时,过渡工作正常,但是当我向回收器视图添加超过(在我的情况下)4个项目时,它开始发生。 带4件物品的GIF 包含 4 个以上项目的 GIF 当我禁用过渡动画时,卡视图扩展可以很好地处理超过4个项目。我认为问题与职位变化有关,但我找不到解决问题的任何解决方案。 我用来实现

  • 如果用户点击一个,我希望它做一些事情,也为两个和三个。我如何实现这一点?