简体   繁体   English

在小吃店上调用UNDO按钮时,已删除的项目为空

[英]The deleted item is empty when invoke UNDO button on snackbar

I'm trying to implement the feature "Swipe to delete" item in recycleview. 我正在尝试在recycleview中实现功能“轻扫以删除”。 But the deleted item is can not restore correctly when invoke UNDO action on snackbar. 但是在小吃店上调用UNDO操作时,无法正确还原已删除的项目。

This is error. 这是错误。 https://i.imgur.com/hPfaBQX.png https://i.imgur.com/hPfaBQX.png

I have tried to implement onChildDraw in different ways, but it does not work 我试图以不同的方式实现onChildDraw ,但是它不起作用

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) {

// backup of removed item
final String deletedItem = adapter.arrIgnoreNumber.get(viewHolder.getAdapterPosition());
final int deletedIndex = viewHolder.getAdapterPosition();


adapter.removeItem(viewHolder.getAdapterPosition());
// showing snack bar with Undo option
Snackbar snackbar = Snackbar.make(coordinatorLayout, "Removed from the list!", Snackbar.LENGTH_LONG);
snackbar.setAction("UNDO", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            adapter.restoreItem(deletedItem, deletedIndex);
                        }
                    });
                    snackbar.setActionTextColor(Color.YELLOW);
                    snackbar.show();
                }
}

@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
Bitmap icon;
            Paint p = new Paint();
            if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){

                View itemView = viewHolder.itemView;
                float height = (float) itemView.getBottom() - (float) itemView.getTop();
                float width = height / 3;

                if(dX > 0){
                    p.setColor(Color.parseColor("#388E3C"));
                    RectF background = new RectF((float) itemView.getLeft(), (float) itemView.getTop(), dX,(float) itemView.getBottom());
                    c.drawRect(background,p);
                    icon = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_delete);
                    RectF icon_dest = new RectF((float) itemView.getLeft() + width ,(float) itemView.getTop() + width,(float) itemView.getLeft()+ 2*width,(float)itemView.getBottom() - width);
                    c.drawBitmap(icon,null,icon_dest,p);
                } else {
                    p.setColor(Color.parseColor("#D32F2F"));
                    RectF background = new RectF((float) itemView.getRight() + dX, (float) itemView.getTop(),(float) itemView.getRight(), (float) itemView.getBottom());
                    c.drawRect(background,p);
                    icon = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_delete);
                    RectF icon_dest = new RectF((float) itemView.getRight() - 2*width ,(float) itemView.getTop() + width,(float) itemView.getRight() - width,(float)itemView.getBottom() - width);
                    c.drawBitmap(icon,null,icon_dest,p);
                }
            }
            super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
        }

I expect the deleted item can restore in list 我希望已删除的项目可以在列表中恢复

  • Update: I provide my adapter for more detail: 更新:我提供了适配器的更多详细信息:
@NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            View view = inflater.inflate(R.layout.list_ignore_item, parent, false);
            return new ViewHolder(view);
        }

@Override
        public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
            final int tmpPos = position;
            viewHolder.phone.setText(arrIgnoreNumber.get(position));
            String name = arrIgnoreNumber.get(position);
            if (!name.isEmpty()) {
                viewHolder.phone.setVisibility(View.VISIBLE);
                viewHolder.name.setText(name);
            } else {
                viewHolder.phone.setVisibility(View.GONE);
                viewHolder.name.setText(arrIgnoreNumber.get(position));
            }
            viewHolder.icon.setImageBitmap(Utils.getBitmapByContactNumber(mContext, arrIgnoreNumber.get(position), false));

@Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public int getItemCount() {
            return arrIgnoreNumber.size();
        }

        public void removeItem(int position) {
            arrIgnoreNumber.remove(position);
            notifyItemRemoved(position);
        }

        public void restoreItem(String item, int position) {
            arrIgnoreNumber.add(position, item);
            notifyItemInserted(position);
        }

The following solution works for me. 以下解决方案适用于我。 Refer to https://www.androidhive.info/2017/09/android-recyclerview-swipe-delete-undo-using-itemtouchhelper/ 请参阅https://www.androidhive.info/2017/09/android-recyclerview-swipe-delete-undo-using-itemtouchhelper/

  1. In ItemTouchHelper.SimpleCallback : ItemTouchHelper.SimpleCallback中
@Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
            return makeMovementFlags(0, ItemTouchHelper.LEFT);
        }

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

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

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

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

        @Override
        public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
            final View foregroundView = ((IgnoreCallAdapter.ViewHolder) viewHolder).foreground;
            getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY,
                    actionState, isCurrentlyActive);
        }

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

        @Override
        public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
            return 0.7f;
        }

        @Override
        public int convertToAbsoluteDirection(int flags, int layoutDirection) {
            return super.convertToAbsoluteDirection(flags, layoutDirection);
        }
  1. In item layout xml : 项目布局xml中
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/row_view_height_ignore_list"
    android:focusable="true"
    android:foreground="?android:attr/selectableItemBackground"
    android:orientation="vertical">

    <RelativeLayout
        android:id="@+id/ignore_item_background"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/ignore_item_bg">
    </RelativeLayout>


    <LinearLayout
        android:id="@+id/ignore_item_foreground"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/bg_ignore_item_foreground"
        android:orientation="horizontal"
        android:visibility="visible">
        </LinearLayout>

    </LinearLayout>

</FrameLayout>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 选择按钮时,项目未更新或删除 - Item not update or deleted when the button is selected 从 RecyclerView 和 Firebase 撤消已删除的项目 - Undo deleted item from RecyclerView and Firebase 我不知道如何使用 SnackBar Undo 恢复 Firestore 上已删除的文档 - I don't know how to restore a deleted document on Firestore using SnackBar Undo 当按下返回按钮时,在SQLite数据库上还原已删除的项目/项目 - Restore a deleted item/items on SQLite database when back button is pressed 显示SnackBar时,按钮必须充当FAB - Button has to act as FAB when the SnackBar is shown 手动关闭小吃店时向下移动按钮 - Move Button down when dissmising snackbar manually 当我单击选项项时,Android Snackbar 没有出现 - Android Snackbar not appearing when I click Option Item 当快餐栏显示启用触摸模式时,无法关注快餐栏中的操作按钮 - Unable to get focus on the action button in snackbar when the snackbar is shown with touch mode enabled Android Snackbar撤消删除操作不会重新加载listview - Android Snackbar undo delete does not reload the listview 当snackbar animation 开始时浮动动作按钮上下跳跃 - Floating Action Button jumps up and down when snackbar animation begins
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM