【问题标题】:How to reset the background buttons (swipe menu) of the recyclerview programmatically?如何以编程方式重置recyclerview的背景按钮(滑动菜单)?
【发布时间】:2020-06-15 07:42:14
【问题描述】:

我有一个 recyclerview,它在我的 android 应用程序上有一个滑动菜单(背景按钮)。 我参考的文章是:https://codeburst.io/android-swipe-menu-with-recyclerview-8f28a235ff28

这篇文章很有帮助,我成功嵌入了滑动菜单功能的基本功能。
但是,在嵌入了 recyclerview 列表的过滤器功能后,我注意到我必须想办法手动/以编程方式重置/清除滑动菜单,因为在过滤了卡片视图列表后,滑动菜单是在每个列表的背景中徘徊,但我不知道如何解决这个问题。 (如附图所示)

我尝试过的事情是:
适配器的 notifyDataSetChanged - 不起作用
适配器的 notifyItemChanged - 不起作用
重置 ItemTouchHelper(置空并重新附加)- 不起作用
recyclerview.performClick 重置 ItemTouchHelper 的状态 - 不起作用

根据文章,似乎单击回收器视图会重置 ItemTouchHelper 的状态。 您能否教我如何以编程方式单击回收站视图或任何其他解决方案(如果有)?

以下代码是我认为与解决此问题相关的文章来源的一小部分...

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 swiping Swipe menus remained after filtering the list

【问题讨论】:

    标签: java filter android-recyclerview listadapter itemtouchhelper


    【解决方案1】:

    我发现在 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-18
      • 2013-09-12
      • 1970-01-01
      • 2011-04-13
      • 2021-05-20
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      相关资源
      最近更新 更多