如何以编程方式重置Recyclerview的背景按钮(滑动菜单)?

问题描述 投票:0回答:1

我有一个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

java filter android-recyclerview listadapter itemtouchhelper
1个回答
0
投票

我发现在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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.