Как пролистнуть, чтобы удалить карту (с помощью appcompat v7 CardView)

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
                                    android:orientation="horizontal"
                                    android:layout_width="match_parent"
                                    android:stateListAnimator="@anim/anim"
                                    android:layout_margin="5dp"
                                    android:clickable="true"
                                    android:layout_height="wrap_content">
    <TextView
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/textview"
              android:minHeight="?android:listPreferredItemHeight"
              android:gravity="center_vertical">

    </TextView>
</android.support.v7.widget.CardView>

Я использую CardView для отображения ряда текстов. Как прокручивать, чтобы удалить эти строки - это карты? Также, как установить onItemClickListener для каждой строки? Опять же, я использую cardview для отображения каждой строки.

Ответы

Ответ 1

Я хотел сделать что-то подобное, поэтому я адаптировал romannurik Android-SwipeToDismiss, чтобы делать именно то, что мы хотели.

Код находится на github с рабочим примерным приложением и состоит из:

  • Подкласс RecyclerView.OnItemTouchListener, который слушает прикосновение к событиям и обнаруживает, когда элемент прокручивается, анимируя его соответствующим образом.
  • A SwipeListener, который вызывается для того, чтобы узнать, может ли элемент быть уволен и снова вызван, когда элементы отклоняются.

Чтобы использовать его, следуйте инструкциям на github или просто скопируйте класс SwipeableRecyclerViewTouchListener в свой проект и используйте его следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mItems = new ArrayList<>(30);
    for (int i = 0; i < 30; i++) {
        mItems.add(String.format("Card number %2d", i));
    }

    mAdapter = new CardViewAdapter(mItems);

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setAdapter(mAdapter);

    SwipeableRecyclerViewTouchListener swipeTouchListener =
            new SwipeableRecyclerViewTouchListener(mRecyclerView,
                    new SwipeableRecyclerViewTouchListener.SwipeListener() {
                        @Override
                        public boolean canSwipe(int position) {
                            return true;
                        }

                        @Override
                        public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
                            for (int position : reverseSortedPositions) {
                                mItems.remove(position);
                                mAdapter.notifyItemRemoved(position);
                            }
                            mAdapter.notifyDataSetChanged();
                        }

                        @Override
                        public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
                            for (int position : reverseSortedPositions) {
                                mItems.remove(position);
                                mAdapter.notifyItemRemoved(position);
                            }
                            mAdapter.notifyDataSetChanged();
                        }
                    });

    mRecyclerView.addOnItemTouchListener(swipeTouchListener);
}

Ответ 2

Вот знаменитый пример "Пролистать на уклонение" от Романа Нурика.

https://github.com/romannurik/Android-SwipeToDismiss

Он включает отклонение элементов в списке и отклонение отдельных View s. Он должен работать с любым View, включая CardView.

SwipeDismissListViewTouchListener предназначен для использования в ListView для прокрутки элементов. SwipeDismissTouchListener для любого View полностью отклонить все View.