【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 )
Android 事件分發 系列文章目錄
【Android 事件分發】事件分發源碼分析 ( 驅動層通過中斷傳遞事件 | WindowManagerService 向 View 層傳遞事件 )
【Android 事件分發】事件分發源碼分析 ( Activity 中各層級的事件傳遞 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
【Android 事件分發】事件分發源碼分析 ( ViewGroup 事件傳遞機制 一 )
【Android 事件分發】事件分發源碼分析 ( ViewGroup 事件傳遞機制 二 )
【Android 事件分發】事件分發源碼分析 ( ViewGroup 事件傳遞機制 三 )
【Android 事件分發】事件分發源碼分析 ( ViewGroup 事件傳遞機制 四 | View 事件傳遞機制 )
【Android 事件分發】事件分發源碼分析 ( ViewGroup 事件傳遞機制 五 )
【Android 事件分發】事件分發源碼分析 ( ViewGroup 事件傳遞機制 六 )
【Android 事件分發】事件分發源碼分析 ( ViewGroup 事件傳遞機制 七 )
【Android 事件分發】ItemTouchHelper 簡介 ( 拖動/滑動事件 | ItemTouchHelper.Callback 回調 )
【Android 事件分發】ItemTouchHelper 實現側滑刪除 ( 設置滑動方向 | 啟用滑動操作 | 滑動距離判定 | 滑動速度判定 | 設置動畫時間 | 設置側滑觸發操作 )
【Android 事件分發】ItemTouchHelper 實現拖動排序 ( 設置滑動方向 | 啟啟用長按拖動功能 | 拖動距離判定 | 設置拖動觸發操作 )
文章目錄
- Android 事件分發 系列文章目錄
- 一、ItemTouchHandler 簡介
- 二、ItemTouchHelper.Callback 自定義實現
- 1、設置移動標志 ( 拖動/滑動 )
- 三、完整代碼實現
- 1、主界面
- 2、ItemTouchHelper.Callback 回調類
- 四、博客資源
一、ItemTouchHandler 簡介
ItemTouchHandler 是 Google 提供的一個工具類 , 主要針對 RecyclerView 的上下左右拖動事件 進行處理 ;
如 : 側滑刪除 功能 , 條目位置拖動交換 功能 , 就可以使用 ItemTouchHandler 實現 ;
如果 RecyclerView 沒有添加 ItemTouchHandler , 只能上下滾動 , 左右拉動 , 沒有效果 , 也無法進行拖動交換條目操作 ;
調用 ItemTouchHandler 的 attachToRecyclerView 方法 , 傳入想要添加上下左右拖動事件的 RecyclerView 對象 , 即可為該 RecyclerView 添加拖動事件 ;
添加后 , 該 RecyclerView 自動可以進行上下左右拖動操作 , 用戶可以自行添加相關的回調 ItemTouchHelper.Callback , 響應這些事件 ;
初始化 RecyclerView 并設置 ItemTouchHelper 示例 :
//1 . 從布局中獲取 RecyclerViewrecycler_view = findViewById(R.id.recycler_view);//2 . 創建并設置布局管理器//創建布局管理器layoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);//設置布局管理器recycler_view.setLayoutManager(layoutManager);// 設置邊距recycler_view.addItemDecoration(new ItemDecoration());//3 . 創建并設置列表適配器adapter = new Adapter();recycler_view.setAdapter(adapter);//4. 添加拖動事件Callback callback = new Callback();mItemTouchHelper = new ItemTouchHelper(callback);mItemTouchHelper.attachToRecyclerView(recycler_view);效果展示 : 此時還沒有加入上下左右 拖動/滑動 操作 ;
二、ItemTouchHelper.Callback 自定義實現
其中的 ItemTouchHelper.Callback 一般都需要開發者自定義子類實現 ;
1、設置移動標志 ( 拖動/滑動 )
重寫 ItemTouchHelper.Callback 的 getMovementFlags 方法 ;
該方法用于設置上下左右動作 , 只有在此處打開了指定方向的設置 , 才可以應用具體方向的拖動 , 動作有兩種 , 一種是滑動 , 如左右側滑 ; 一種是拖動 , 長按后激活拖動操作 , 可用于拖動交換位置操作 ;
拖動 / 滑動 標志位可以使用 ItemTouchHelper.UP | ItemTouchHelper.DOWN , 或運算得到想要的標志位 ;
將或運算結果傳入 makeMovementFlags 方法 , 第一個參數是設置拖動標志位 , 第二個參數是設置滑動標志位 ;
設置 左右滑動 , 上下拖動代碼如下 :
/*** 設置上下左右動作* 只有在此處打開了指定方向的設置 , 才可以應用具體方向的拖動* @param recyclerView* @param viewHolder* @return*/@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {/*設置拖動方向, 此處設置上下拖動事件*/int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;/*設置滑動方向, 此處設置左右側滑事件*/int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;// 應用 拖動 和 滑動 設置return makeMovementFlags(dragFlags, swipeFlags);}效果展示 :
三、完整代碼實現
1、主界面
package kim.hsl.recyclerview;import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.StaggeredGridLayoutManager;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {/*** 數據源*/private ArrayList<String> names = new ArrayList<String>();/*** 當前的 RecyclerView 列表*/private RecyclerView recycler_view;/*** 布局管理器*/private LinearLayoutManager layoutManager;/*** 適配器*/private Adapter adapter;/*** 添加拖動處理*/private ItemTouchHelper mItemTouchHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化數據initData();//1 . 從布局中獲取 RecyclerViewrecycler_view = findViewById(R.id.recycler_view);//2 . 創建并設置布局管理器//創建布局管理器layoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);//設置布局管理器recycler_view.setLayoutManager(layoutManager);// 設置邊距recycler_view.addItemDecoration(new ItemDecoration());//3 . 創建并設置列表適配器adapter = new Adapter();recycler_view.setAdapter(adapter);//4. 添加拖動事件Callback callback = new Callback();mItemTouchHelper = new ItemTouchHelper(callback);//mItemTouchHelper.attachToRecyclerView(recycler_view);}/*** 初始化數據*/private void initData(){names.add("宋江");names.add("盧俊義");names.add("吳用");names.add("公孫勝");names.add("關勝");names.add("林沖");names.add("秦明");names.add("呼延灼");names.add("花榮");names.add("柴進");names.add("李應");names.add("朱仝");names.add("魯智深");names.add("武松");names.add("董平");names.add("張清");names.add("楊志");names.add("徐寧");names.add("索超");}/*** RecyclerView 適配器*/public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View root_view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recyclerview, parent, false);return new ViewHolder(root_view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.text.setText("" + names.get(position));}@Overridepublic int getItemCount() {return names.size();}public class ViewHolder extends RecyclerView.ViewHolder {TextView text;public ViewHolder(@NonNull View itemView) {super(itemView);text = itemView.findViewById(R.id.text);}}}}
2、ItemTouchHelper.Callback 回調類
package kim.hsl.recyclerview;import android.graphics.Canvas;import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView;public class Callback extends ItemTouchHelper.Callback {@Overridepublic boolean isLongPressDragEnabled() {return super.isLongPressDragEnabled();}@Overridepublic boolean isItemViewSwipeEnabled() {return super.isItemViewSwipeEnabled();}@Overridepublic void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {super.onSelectedChanged(viewHolder, actionState);}@Overridepublic void onMoved(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, int fromPos, @NonNull RecyclerView.ViewHolder target, int toPos, int x, int y) {super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);}/*** 設置上下左右動作* 只有在此處打開了指定方向的設置 , 才可以應用具體方向的拖動* @param recyclerView* @param viewHolder* @return*/@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {/*設置拖動方向, 此處設置上下拖動事件*/int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;/*設置滑動方向, 此處設置左右側滑事件*/int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;// 應用 拖動 和 滑動 設置return makeMovementFlags(dragFlags, swipeFlags);}@Overridepublic boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {return false;}@Overridepublic void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {}@Overridepublic void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);}@Overridepublic void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);} }
四、博客資源
博客資源 :
- GitHub 地址 : https://github.com/han1202012/001_RecyclerView
總結
以上是生活随笔為你收集整理的【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】NDK 配置错误 ( C/C
- 下一篇: 【Android 事件分发】ItemTo