RecyclerView onSwiped行为随机

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

我正在尝试开发类似Gmail的功能,您可以在其中滑动以将其删除。这是我的回收站视图的主要片段。

public class MainFragment extends Fragment implements RecyclerItemTouchHelper.RecyclerItemTouchHelperListener {

RecyclerView recyclerView;
CoordinatorLayout coordinatorLayout;
RecyclerViewAdapter recyclerViewAdapter = null;
private View view;
private Context context = null;
ArrayList<Note> notes = new ArrayList<>();
ArrayList<Note> allNotes;
FloatingActionButton fab;
boolean isLoading = false;


private MainViewModel mViewModel;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.main_fragment, container, false);
    view = root;

    recyclerView = view.findViewById(R.id.recyclerView);
    ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this);
    new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);

    return root;
}


@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
    coordinatorLayout = view.findViewById(R.id.mainContent)
    populateNotesView();
}



@Override
public void onResume() {
    super.onResume();
}

public void populateNotesView() {
    MainViewModel obj = new MainViewModel();
    allNotes = obj.getData(getContext());
    notes.clear();
    for (int i = 0; i < 10 && i < allNotes.size(); i++) {
        notes.add(allNotes.get(i));
    }

    initAdapter(notes);
}

private void initAdapter(ArrayList<Note> notes) {
    recyclerViewAdapter = new RecyclerViewAdapter(notes, getFragmentManager());
    recyclerView.setAdapter(recyclerViewAdapter);
    initScrollListener();
}

@Override
public void onDelete(final RecyclerView.ViewHolder viewHolder, int position) {

    if (viewHolder instanceof RecyclerViewAdapter.ItemViewHolder) {
        ArrayList<Note> notesList = allNotes;
        String name = notesList.get(viewHolder.getAdapterPosition()).getText();

        final Note deletedItem = notesList.get(viewHolder.getAdapterPosition());
        final int deletedIndex = viewHolder.getAdapterPosition();
        recyclerViewAdapter = new RecyclerViewAdapter(notesList,  getFragmentManager());
        recyclerViewAdapter.removeItem(viewHolder.getAdapterPosition(), getContext());
        Snackbar snackbar = Snackbar.make(coordinatorLayout, name + " removed from cart!", Snackbar.LENGTH_LONG);
        snackbar.setAction("UNDO", new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                recyclerViewAdapter.restoreItem(deletedItem, deletedIndex, getContext());
                populateNotesView();
            }
        });
        snackbar.setActionTextColor(Color.YELLOW);
        snackbar.show();

        //Reloading fragment
        getFragmentManager().beginTransaction()
                .replace(R.id.mainContent, MainFragment.newInstance())
                .commitNow();
    }


}
}

这是我的RecyclerItemTouchHelper

public class RecyclerItemTouchHelper extends ItemTouchHelper.SimpleCallback {
    private RecyclerItemTouchHelperListener listener;
    private boolean delete = false;

    public RecyclerItemTouchHelper(int dragDirs, int swipeDirs, RecyclerItemTouchHelperListener listener) {
        super(dragDirs, swipeDirs);
        this.listener = listener;
    }

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

    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        if (viewHolder != null) {
            final View foregroundView = ((RecyclerViewAdapter.ItemViewHolder) viewHolder).viewForeground;

            getDefaultUIUtil().onSelected(foregroundView);
        }
    }

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


    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        final View foregroundView = ((RecyclerViewAdapter.ItemViewHolder) viewHolder).viewForeground;
        getDefaultUIUtil().clearView(foregroundView);
    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView,
                            final RecyclerView.ViewHolder viewHolder, float dX, float dY,
                            int actionState, boolean isCurrentlyActive) {
            final View foregroundView = ((RecyclerViewAdapter.ItemViewHolder) viewHolder).viewForeground;

            getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY,
                    actionState, isCurrentlyActive);

    }

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

    @Override
    public int convertToAbsoluteDirection(int flags, int layoutDirection) {
        return super.convertToAbsoluteDirection(flags, layoutDirection);
    }

    public interface RecyclerItemTouchHelperListener {
        void onDelete(RecyclerView.ViewHolder viewHolder, int position);
    }
}

现在刷一次recyclerview项,不会每次都调用onSwiped方法。我正在完全刷卡该物品。

编辑:添加的任何新项目均已成功删除,但已添加的项目不会被删除。

感谢您的帮助。预先感谢。

java android android-recyclerview recycler-adapter
1个回答
0
投票

该项目未删除,因为您通过使用下面的代码行在onDelete()中使用原始列表:

ArrayList<Note> notesList = allNotes;

这意味着,无论何时删除项目,您都将返回到原始列表。

第二个问题是,当您使用sanckbar操作撤消删除操作时,通过执行以下操作可以执行相同的操作:

populateNotesView();

为了解决这个问题,您需要从提供了RecyclerView适配器的原始列表中删除该项目,而只需调用notifyItemRemoved()作为删除的位置。

为此,将onDelete()更改为:

@Override
public void onDelete(final RecyclerView.ViewHolder viewHolder, int position) {

    if (viewHolder instanceof RecyclerViewAdapter.ItemViewHolder) {

        String name = allNotes.get(viewHolder.getAdapterPosition()).getText();

        final Note deletedItem = allNotes.get(viewHolder.getAdapterPosition());
        final int deletedIndex = viewHolder.getAdapterPosition();
        allNotes.remove(deletedIndex);
        recyclerViewAdapter.notifyItemRemoved(deletedIndex);

       Snackbar snackbar = Snackbar.make(coordinatorLayout, name + " removed from cart!", Snackbar.LENGTH_LONG);
        snackbar.setAction("UNDO", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                allNotes.add(deletedIndex, deletedItem);
                recyclerViewAdapter.notifyItemInserted(deletedIndex);
            }
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.