【RecyclerView】 十五、使用 ItemTouchHelper 实现 RecyclerView 拖动排序 ( ItemTouchHelper 简介 )
文章目錄
- 一、ItemTouchHelper 簡(jiǎn)介
- 二、RecyclerView 相關(guān)資料
一、ItemTouchHelper 簡(jiǎn)介
官方文檔 : https://developer.android.google.cn/reference/kotlin/androidx/recyclerview/widget/ItemTouchHelper
ItemTouchHelper 可以為 RecyclerView 添加 滑動(dòng)刪除效果 和 拖動(dòng)效果 ;
ItemTouchHelper 需要與 RecyclerView 和 ItemTouchHelper.Callback 結(jié)合起來使用 ;
根據(jù)想要開發(fā)的功能 , 重寫不同的方法 ;
如果是想要開發(fā)拖動(dòng)效果相關(guān)的功能 , 重寫 ItemTouchHelper.Callback 的 onMoved 方法 ;
public abstract boolean onMove(@NonNull RecyclerView recyclerView,@NonNull ViewHolder viewHolder, @NonNull ViewHolder target);如果想要開發(fā)滑動(dòng)相關(guān)效果 , 重寫 ItemTouchHelper.Callback 的 onSwiped 方法 ;
public abstract void onSwiped(@NonNull ViewHolder viewHolder, int direction);ItemTouchHelper 需要與 LayoutManager 布局管理器結(jié)合使用 ;
通過 繼承 ItemTouchHelper.Callback 抽象類 , 或
實(shí)現(xiàn) ItemTouchHelper.Callback 接口 ,
這兩個(gè)操作 自定義 LayoutManager 布局管理器 , 可以達(dá)到最優(yōu)化的效果 ;
看一下 Android 官方定義的 線性布局管理器 LinearLayoutManager , 就實(shí)現(xiàn)了 ItemTouchHelper.ViewDropHandler 接口 ;
public class LinearLayoutManager extends RecyclerView.LayoutManager implementsItemTouchHelper.ViewDropHandler, RecyclerView.SmoothScroller.ScrollVectorProvider { }默認(rèn)情況下 , ItemTouchHelper 移動(dòng) item 組件的 translateX 或 translateY 屬性 , 為其重新設(shè)置位置 ;
開發(fā)者可以自定義這些行為通過覆蓋 ItemTouchHelper.Callback 的 onChildDraw 和 onChildDrawOver 方法 ;
大多數(shù)情況下只需要覆蓋 onChildDraw 方法即可 ;
onChildDraw 方法原型 :
public class ItemTouchHelper extends RecyclerView.ItemDecorationimplements RecyclerView.OnChildAttachStateChangeListener {public abstract static class Callback {/*** Called by ItemTouchHelper on RecyclerView's onDraw callback.* <p>* If you would like to customize how your View's respond to user interactions, this is* a good place to override.* <p>* Default implementation translates the child by the given <code>dX</code>,* <code>dY</code>.* ItemTouchHelper also takes care of drawing the child after other children if it is being* dragged. This is done using child re-ordering mechanism. On platforms prior to L, this* is* achieved via {@link android.view.ViewGroup#getChildDrawingOrder(int, int)} and on L* and after, it changes View's elevation value to be greater than all other children.)** @param c The canvas which RecyclerView is drawing its children* @param recyclerView The RecyclerView to which ItemTouchHelper is attached to* @param viewHolder The ViewHolder which is being interacted by the User or it was* interacted and simply animating to its original position* @param dX The amount of horizontal displacement caused by user's action* @param dY The amount of vertical displacement caused by user's action* @param actionState The type of interaction on the View. Is either {@link* #ACTION_STATE_DRAG} or {@link #ACTION_STATE_SWIPE}.* @param isCurrentlyActive True if this view is currently being controlled by the user or* false it is simply animating back to its original state.* @see #onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int,* boolean)*/public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,@NonNull ViewHolder viewHolder,float dX, float dY, int actionState, boolean isCurrentlyActive) {ItemTouchUIUtilImpl.INSTANCE.onDraw(c, recyclerView, viewHolder.itemView, dX, dY,actionState, isCurrentlyActive);}} }onChildDrawOver 方法原型 :
public class ItemTouchHelper extends RecyclerView.ItemDecorationimplements RecyclerView.OnChildAttachStateChangeListener {public abstract static class Callback {/*** Called by ItemTouchHelper on RecyclerView's onDraw callback.* <p>* If you would like to customize how your View's respond to user interactions, this is* a good place to override.* <p>* Default implementation translates the child by the given <code>dX</code>,* <code>dY</code>.* ItemTouchHelper also takes care of drawing the child after other children if it is being* dragged. This is done using child re-ordering mechanism. On platforms prior to L, this* is* achieved via {@link android.view.ViewGroup#getChildDrawingOrder(int, int)} and on L* and after, it changes View's elevation value to be greater than all other children.)** @param c The canvas which RecyclerView is drawing its children* @param recyclerView The RecyclerView to which ItemTouchHelper is attached to* @param viewHolder The ViewHolder which is being interacted by the User or it was* interacted and simply animating to its original position* @param dX The amount of horizontal displacement caused by user's action* @param dY The amount of vertical displacement caused by user's action* @param actionState The type of interaction on the View. Is either {@link* #ACTION_STATE_DRAG} or {@link #ACTION_STATE_SWIPE}.* @param isCurrentlyActive True if this view is currently being controlled by the user or* false it is simply animating back to its original state.* @see #onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int,* boolean)*/public void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView,ViewHolder viewHolder,float dX, float dY, int actionState, boolean isCurrentlyActive) {ItemTouchUIUtilImpl.INSTANCE.onDrawOver(c, recyclerView, viewHolder.itemView, dX, dY,actionState, isCurrentlyActive);}} }二、RecyclerView 相關(guān)資料
官方文檔 :
使用 RecyclerView 創(chuàng)建動(dòng)態(tài)列表 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview
高級(jí) RecyclerView 自定義 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview-custom
RecyclerView 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView
RecyclerView.Adapter 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.Adapter
RecyclerView.ViewHolder 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder
RecyclerView.ItemDecoration 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/RecyclerView.ItemDecoration
GridLayoutManager 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/GridLayoutManager
LinearLayoutManager 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/LinearLayoutManager
StaggeredGridLayoutManager 官方文檔 : https://developer.android.google.cn/reference/androidx/recyclerview/widget/StaggeredGridLayoutManager
ItemTouchHelper 官方文檔 : https://developer.android.google.cn/reference/kotlin/androidx/recyclerview/widget/ItemTouchHelper
ItemTouchHelper.Callback 官方文檔 : https://developer.android.google.cn/reference/kotlin/androidx/recyclerview/widget/ItemTouchHelper.Callback
代碼示例 :
GitHub 源碼地址 : https://github.com/han1202012/001_RecyclerView
博客源碼快照 : https://download.csdn.net/download/han1202012/14984775
( 使用 Android Studio 打開 )
總結(jié)
以上是生活随笔為你收集整理的【RecyclerView】 十五、使用 ItemTouchHelper 实现 RecyclerView 拖动排序 ( ItemTouchHelper 简介 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【RecyclerView】 十四、Gr
- 下一篇: 【错误记录】Flutter 设备连接显示