Расширенная библиотека RecyclerView – примеры кода

https://github.com/h6ah4i/android-advancedrecyclerview

Похоже, что это отличная библиотека с точки зрения того, какую функциональность она предлагает. Однако ему не хватает хорошей документации. У него есть «учебник» по элементам Swipeable , но, как и некоторые другие люди, я не мог его проследить.

У кого-нибудь есть рабочий пример или кто-нибудь может сделать простой пример использования прокрутки элемента и показ кнопки под ним с использованием этой библиотеки? Это было бы полезно для многих людей, заинтересованных в этой функциональности.

Я нашел библиотеку хорошо документированной и простой в использовании.

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

Надеемся, что последующие советы помогут еще лучше понять шаблон, в котором реализованы образцы.

обзор

createAdapter в LauncherPageFragment дает обзор того, какое действие содержит какую функцию

Каждый образец следует за одним из двух шаблонов:

Базовый образец
В случае базового образца адаптер и держатель вида, необходимые для просмотра ресайклера, определяются в одном классе активности.

Комплексный образец
В случае сложной выборки адаптер и держатель вида создаются отдельно, и вид ресайклера сам определяется в другом фрагменте.
В таких случаях имеется дополнительный фрагмент, который добавляется в действие. Они присутствуют в пакете com.h6ah4i.android.example.advrecyclerview.common.fragment , который используется для предоставления данных, которые должны отображаться в представлении recycler.

Для прокрутки с помощью кнопки вам необходимо создать RecyclerViewTouchActionGuardManager (для подавления прокрутки при запуске анимации прокрутки) и RecyclerViewSwipeManager для создания обернутого адаптера.

Для адаптера вам понадобится SwipeableItemAdapter интерфейс SwipeableItemAdapter и обладателю вида необходимо расширить AbstractSwipeableItemViewHolder вместо RecyclerView.ViewHolder.

Примечание. Я изменил реализацию onSetSwipeBackground В исходном примере он установил некоторый фон в itemview.
Это не было необходимо в случае, когда должен отображаться вид внизу. Также он вызывал ненужные перерисовки.

Вы можете найти более подробную документацию на главном веб-сайте: https://advancedrecyclerview.h6ah4i.com

И в скопированной странице в документе будет скопировано следующее:


Шаг 1. Сделайте адаптер поддерживает стабильные идентификаторы

Этот шаг очень важен. Если адаптер не возвращает стабильные и уникальные идентификаторы, это вызовет некоторые странные поведения (неправильные анимации, NPE и т. Д.)

 class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { MyAdapter() { setHasStableIds(true); } @Override public long getItemId(int position) { // requires static value, it means need to keep the same value // even if the item position has been changed. return mItems.get(position).getId(); } } 

Шаг 2. Измените файл макета видов элементов.

Оберните просмотры контента другим FrameLayout FrameLayout с @+id/container .

 <!-- for itemView --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="56dp"> <!-- Content View(s) --> <TextView android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"/> </FrameLayout> 

⏬ ⏬ ⏬

 <!-- for itemView --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="56dp"> <!-- for getSwipeableContainerView() --> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- Content View(s) --> <TextView android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"/> </FrameLayout> </FrameLayout> 

Шаг 3. Измените ViewHolder

  1. Измените родительский класс на AbstractSwipeableItemViewHolder .
  2. Внедрите getSwipeableContainerView() .

Примечание. Класс AbstractSwipeableItemViewHolder – это класс удобства, который реализует методы использования «SwipeableItemViewHolder».

 class MyAdapter ... { static class MyViewHolder extends RecyclerView.ViewHolder { TextView textView; MyViewHolder(View v) { super(v); textView = (TextView) v.findViewById(android.R.id.text1); } } ... } 

⏬ ⏬ ⏬

 class MyAdapter ... { static class MyViewHolder extends AbstractSwipeableItemViewHolder { TextView textView; FrameLayout containerView; public MyViewHolder(View v) { super(v); textView = (TextView) v.findViewById(android.R.id.text1); containerView = (FrameLayout) v.findViewById(R.id.container); } @Override public View getSwipeableContainerView() { return containerView; } } } 

Шаг 4. Внедрение интерфейса SwipeableItemAdapter

 class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { ... } 

⏬ ⏬ ⏬

 class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements SwipeableItemAdapter<MyAdapter.MyViewHolder> { @Override public int onGetSwipeReactionType(MyViewHolder holder, int position, int x, int y) { // Make swipeable to LEFT direction return Swipeable.REACTION_CAN_SWIPE_LEFT; } @Override public void onSetSwipeBackground(MyViewHolder holder, int position, int type) { // You can set background color/resource to holder.itemView. // The argument "type" can be one of the followings; // - Swipeable.DRAWABLE_SWIPE_NEUTRAL_BACKGROUND // - Swipeable.DRAWABLE_SWIPE_LEFT_BACKGROUND // (- Swipeable.DRAWABLE_SWIPE_UP_BACKGROUND) // (- Swipeable.DRAWABLE_SWIPE_RIGHT_BACKGROUND) // (- Swipeable.DRAWABLE_SWIPE_DOWN_BACKGROUND) if (type == Swipeable.DRAWABLE_SWIPE_LEFT_BACKGROUND) { holder.itemView.setBackgroundColor(Color.YELLOW); } else { holder.itemView.setBackgroundColor(Color.TRANSPARENT); } } @Override public SwipeResultAction onSwipeItem(MyViewHolder holder, int position, int result) { // Return sub class of the SwipeResultAction. // // Available base (abstract) classes are; // - SwipeResultActionDefault // - SwipeResultActionMoveToSwipedDirection // - SwipeResultActionRemoveItem // - SwipeResultActionDoNothing // The argument "result" can be one of the followings; // // - Swipeable.RESULT_CANCELED // - Swipeable.RESULT_SWIPED_LEFT // (- Swipeable.RESULT_SWIPED_UP) // (- Swipeable.RESULT_SWIPED_RIGHT) // (- Swipeable.RESULT_SWIPED_DOWN) if (result == Swipeable.RESULT_LEFT) { return new SwipeResultActionMoveToSwipedDirection() { // Optionally, you can override these three methods // - void onPerformAction() // - void onSlideAnimationEnd() // - void onCleanUp() }; } else { return new SwipeResultActionDoNothing(); } } } 

Шаг 5. Измените процесс инициализации RecyclerView

Поместите некоторый дополнительный процесс инициализации в свой Activity / Fragment .

  1. Выполните активацию RecyclerViewSwipeManager .
  2. Создайте обернутый адаптер и установите его в RecyclerView .
  3. Прикрепите RecyclerView к RecyclerViewSwipeManager .

 void onCreate() { ... RecyclerView recyclerView = findViewById(R.id.recyclerView); MyAdapter adapter = new MyAdapter(); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); } 

⏬ ⏬ ⏬

 void onCreate() { ... RecyclerView recyclerView = findViewById(R.id.recyclerView); RecyclerViewSwipeManager swipeManager = new RecyclerViewSwipeManager(); MyAdapter adapter = new MyAdapter(); RecyclerView.Adapter wrappedAdapter = swipeManager.createWrappedAdapter(adapter); recyclerView.setAdapter(wrappedAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); // disable change animations ((SimpleItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false); swipeManager.attachRecyclerView(recyclerView); } 

Надеюсь, мой ответ поможет.