【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 )
Android 事件分發(fā) 系列文章目錄
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( 驅(qū)動層通過中斷傳遞事件 | WindowManagerService 向 View 層傳遞事件 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( Activity 中各層級的事件傳遞 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機制 一 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機制 二 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機制 三 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機制 四 | View 事件傳遞機制 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機制 五 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機制 六 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機制 七 )
【Android 事件分發(fā)】ItemTouchHelper 簡介 ( 拖動/滑動事件 | ItemTouchHelper.Callback 回調(diào) )
【Android 事件分發(fā)】ItemTouchHelper 實現(xiàn)側(cè)滑刪除 ( 設(shè)置滑動方向 | 啟用滑動操作 | 滑動距離判定 | 滑動速度判定 | 設(shè)置動畫時間 | 設(shè)置側(cè)滑觸發(fā)操作 )
【Android 事件分發(fā)】ItemTouchHelper 實現(xiàn)拖動排序 ( 設(shè)置滑動方向 | 啟啟用長按拖動功能 | 拖動距離判定 | 設(shè)置拖動觸發(fā)操作 )
文章目錄
- Android 事件分發(fā) 系列文章目錄
- 一、ItemTouchHandler 簡介
- 二、ItemTouchHelper.Callback 自定義實現(xiàn)
- 1、設(shè)置移動標(biāo)志 ( 拖動/滑動 )
- 三、完整代碼實現(xiàn)
- 1、主界面
- 2、ItemTouchHelper.Callback 回調(diào)類
- 四、博客資源
一、ItemTouchHandler 簡介
ItemTouchHandler 是 Google 提供的一個工具類 , 主要針對 RecyclerView 的上下左右拖動事件 進行處理 ;
如 : 側(cè)滑刪除 功能 , 條目位置拖動交換 功能 , 就可以使用 ItemTouchHandler 實現(xiàn) ;
如果 RecyclerView 沒有添加 ItemTouchHandler , 只能上下滾動 , 左右拉動 , 沒有效果 , 也無法進行拖動交換條目操作 ;
調(diào)用 ItemTouchHandler 的 attachToRecyclerView 方法 , 傳入想要添加上下左右拖動事件的 RecyclerView 對象 , 即可為該 RecyclerView 添加拖動事件 ;
添加后 , 該 RecyclerView 自動可以進行上下左右拖動操作 , 用戶可以自行添加相關(guān)的回調(diào) ItemTouchHelper.Callback , 響應(yīng)這些事件 ;
初始化 RecyclerView 并設(shè)置 ItemTouchHelper 示例 :
//1 . 從布局中獲取 RecyclerViewrecycler_view = findViewById(R.id.recycler_view);//2 . 創(chuàng)建并設(shè)置布局管理器//創(chuàng)建布局管理器layoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);//設(shè)置布局管理器recycler_view.setLayoutManager(layoutManager);// 設(shè)置邊距recycler_view.addItemDecoration(new ItemDecoration());//3 . 創(chuàng)建并設(shè)置列表適配器adapter = new Adapter();recycler_view.setAdapter(adapter);//4. 添加拖動事件Callback callback = new Callback();mItemTouchHelper = new ItemTouchHelper(callback);mItemTouchHelper.attachToRecyclerView(recycler_view);效果展示 : 此時還沒有加入上下左右 拖動/滑動 操作 ;
二、ItemTouchHelper.Callback 自定義實現(xiàn)
其中的 ItemTouchHelper.Callback 一般都需要開發(fā)者自定義子類實現(xiàn) ;
1、設(shè)置移動標(biāo)志 ( 拖動/滑動 )
重寫 ItemTouchHelper.Callback 的 getMovementFlags 方法 ;
該方法用于設(shè)置上下左右動作 , 只有在此處打開了指定方向的設(shè)置 , 才可以應(yīng)用具體方向的拖動 , 動作有兩種 , 一種是滑動 , 如左右側(cè)滑 ; 一種是拖動 , 長按后激活拖動操作 , 可用于拖動交換位置操作 ;
拖動 / 滑動 標(biāo)志位可以使用 ItemTouchHelper.UP | ItemTouchHelper.DOWN , 或運算得到想要的標(biāo)志位 ;
將或運算結(jié)果傳入 makeMovementFlags 方法 , 第一個參數(shù)是設(shè)置拖動標(biāo)志位 , 第二個參數(shù)是設(shè)置滑動標(biāo)志位 ;
設(shè)置 左右滑動 , 上下拖動代碼如下 :
/*** 設(shè)置上下左右動作* 只有在此處打開了指定方向的設(shè)置 , 才可以應(yīng)用具體方向的拖動* @param recyclerView* @param viewHolder* @return*/@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {/*設(shè)置拖動方向, 此處設(shè)置上下拖動事件*/int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;/*設(shè)置滑動方向, 此處設(shè)置左右側(cè)滑事件*/int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;// 應(yīng)用 拖動 和 滑動 設(shè)置return makeMovementFlags(dragFlags, swipeFlags);}效果展示 :
三、完整代碼實現(xiàn)
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 {/*** 數(shù)據(jù)源*/private ArrayList<String> names = new ArrayList<String>();/*** 當(dāng)前的 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);// 初始化數(shù)據(jù)initData();//1 . 從布局中獲取 RecyclerViewrecycler_view = findViewById(R.id.recycler_view);//2 . 創(chuàng)建并設(shè)置布局管理器//創(chuàng)建布局管理器layoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);//設(shè)置布局管理器recycler_view.setLayoutManager(layoutManager);// 設(shè)置邊距recycler_view.addItemDecoration(new ItemDecoration());//3 . 創(chuàng)建并設(shè)置列表適配器adapter = new Adapter();recycler_view.setAdapter(adapter);//4. 添加拖動事件Callback callback = new Callback();mItemTouchHelper = new ItemTouchHelper(callback);//mItemTouchHelper.attachToRecyclerView(recycler_view);}/*** 初始化數(shù)據(jù)*/private void initData(){names.add("宋江");names.add("盧俊義");names.add("吳用");names.add("公孫勝");names.add("關(guān)勝");names.add("林沖");names.add("秦明");names.add("呼延灼");names.add("花榮");names.add("柴進");names.add("李應(yīng)");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 回調(diào)類
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);}/*** 設(shè)置上下左右動作* 只有在此處打開了指定方向的設(shè)置 , 才可以應(yīng)用具體方向的拖動* @param recyclerView* @param viewHolder* @return*/@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {/*設(shè)置拖動方向, 此處設(shè)置上下拖動事件*/int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;/*設(shè)置滑動方向, 此處設(shè)置左右側(cè)滑事件*/int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;// 應(yīng)用 拖動 和 滑動 設(shè)置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
總結(jié)
以上是生活随笔為你收集整理的【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】NDK 配置错误 ( C/C
- 下一篇: 【Android 事件分发】ItemTo