我有一个recyclerview,它在我的android应用中具有一个滑动菜单(背景按钮)。我提到的文章是:https://codeburst.io/android-swipe-menu-with-recyclerview-8f28a235ff28
本文非常有帮助,我成功地嵌入了滑动菜单功能的基本功能。但是,在嵌入了用于回收站视图列表的过滤器功能之后,我注意到我必须找出一种方法来手动/以编程方式重置/清除刷卡菜单,因为在过滤卡视图列表之后,在每个列表的背景中徘徊,但我不知道如何解决此问题。 (如附图所示) 我尝试过的事情是:适配器的notifyDataSetChanged-不起作用由适配器进行notifyItemChanged-不起作用重置ItemTouchHelper(输入null并重新连接)-不起作用recyclerview.performClick重置ItemTouchHelper的状态-不起作用 根据这篇文章,似乎单击一个recyclerview会重置ItemTouchHelper的状态。您能否教我如何以编程方式或任何其他解决方案单击recyclerview?
下面的代码只是我认为与解决该问题有关的文章的一部分,
private void setTouchUpListener(final Canvas c,
final RecyclerView recyclerView,
final RecyclerView.ViewHolder viewHolder,
final float dX, final float dY,
final int actionState, final boolean isCurrentlyActive) {
recyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
SwipeController.super.onChildDraw(c, recyclerView, viewHolder, 0F, dY, actionState, isCurrentlyActive);
recyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
});
setItemsClickable(recyclerView, true);
swipeBack = false;
buttonShowedState = ButtonsState.GONE;
}
return false;
}
});
}
After the swipe menu emerged by swipingSwipe menus remained after filtering the list
我发现在recyclerview上添加布局更改侦听器可以删除滑动菜单。
@Override
public int getMovementFlags(@NotNull final RecyclerView recyclerView, @NotNull final RecyclerView.ViewHolder viewHolder) {
myRecyclerView = recyclerView;
myRecyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
v.removeOnLayoutChangeListener(this);
clearSwipeMenu();
}
});
}
....
@Override
public void onChildDraw(@NotNull Canvas c, @NotNull RecyclerView recyclerView, @NotNull RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ACTION_STATE_SWIPE) {
if (buttonShowedState != ButtonsState.GONE) {
if (buttonShowedState == ButtonsState.LEFT_VISIBLE) dX = Math.max(dX, buttonWidth);
if (buttonShowedState == ButtonsState.RIGHT_VISIBLE) dX = Math.min(dX, -buttonWidth);
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
} else {
setTouchListener(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}
if (buttonShowedState == ButtonsState.GONE) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
currentItemViewHolder = viewHolder;
}
....
public void clearSwipeMenu() {
if(currentItemViewHolder!=null){
clearView(myRecyclerView, currentItemViewHolder);
currentItemViewHolder = null;
}
}