RecyclerView смахивает удалить во фрагменте? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать функцию, при которой, если пользователь проведет пальцем ВЛЕВО по элементу в RecyclerView, элемент будет удален.

Мой RecyclerView находится внутри фрагмента, который находится внутри FrameLayout, управляемого BottomNavigation.

У меня есть код, в котором он работает, когда RecyclerView находится в своем собственном действии, но когда я передаю его во фрагмент, функциональность считывания нарушается. Я не могу сильно ударить.

В моем фрагменте я расширяю интерфейс RecyclerItemTouchHelperListener.

interface RecyclerItemTouchHelperListener {
    void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position);
}

Затем я создаю обратный вызов

ItemTouchHelper.SimpleCallback ItemTouchHelperCallbackLeft = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this);
new ItemTouchHelper(ItemTouchHelperCallbackLeft).attachToRecyclerView(recyclerView);

Теперь я создаю функцию с именем OnSwiped для обработки смахивания.

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) {
    if (viewHolder instanceof ListAdapter.ViewHolder) {
        if (direction == ItemTouchHelper.LEFT) {
            String cityName = stationList.get(viewHolder.getAdapterPosition()).getData().getCity();

            //Create a backup of the deleted item in case user wants to undo delete
            Station deletedStation = stationList.get(viewHolder.getAdapterPosition());
            int deletedStationIndex = viewHolder.getAdapterPosition();

            //Remove the item from RecyclerView
            listAdapter.removeItem(deletedStationIndex);

            Snackbar snackbar = Snackbar.make(coordinatorLayout, cityName + " removed from list!", Snackbar.LENGTH_LONG);
            snackbar.setAction("UNDO", new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    // undo is selected, restore the deleted item
                    listAdapter.restoreItem(deletedStation, position);
                }
            });
            snackbar.show();
        }
    }
}

А вот и класс RecyclerItemTouchHelper.

открытый класс RecyclerItemTouchHelper extends ItemTouchHelper.SimpleCallback { частный слушатель RecyclerItemTouchHelperListener;

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 onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    listener.onSwiped(viewHolder, direction, viewHolder.getAdapterPosition());
}

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

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

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

@Override
public void onChildDraw(Canvas canvas, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    final View foregroundView = ((ListAdapter.ViewHolder) viewHolder).listViewForeground;

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

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

}

Имейте в виду, что все работает, когда RecyclerView находится внутри своего собственного Activity, но когда я передаю свой RecyclerView во фрагмент, эта функция смахивания не работает.

1 Ответ

0 голосов
/ 18 января 2019

Я исправил проблему, переместив функцию обратного вызова после инициализации моего RecyclerView.

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