日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 )

發(fā)布時(shí)間:2025/6/17 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 ) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android 事件分發(fā) 系列文章目錄


【Android 事件分發(fā)】事件分發(fā)源碼分析 ( 驅(qū)動(dòng)層通過中斷傳遞事件 | WindowManagerService 向 View 層傳遞事件 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( Activity 中各層級(jí)的事件傳遞 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機(jī)制 一 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機(jī)制 二 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機(jī)制 三 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機(jī)制 四 | View 事件傳遞機(jī)制 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機(jī)制 五 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機(jī)制 六 )
【Android 事件分發(fā)】事件分發(fā)源碼分析 ( ViewGroup 事件傳遞機(jī)制 七 )

【Android 事件分發(fā)】ItemTouchHelper 簡介 ( 拖動(dòng)/滑動(dòng)事件 | ItemTouchHelper.Callback 回調(diào) )
【Android 事件分發(fā)】ItemTouchHelper 實(shí)現(xiàn)側(cè)滑刪除 ( 設(shè)置滑動(dòng)方向 | 啟用滑動(dòng)操作 | 滑動(dòng)距離判定 | 滑動(dòng)速度判定 | 設(shè)置動(dòng)畫時(shí)間 | 設(shè)置側(cè)滑觸發(fā)操作 )
【Android 事件分發(fā)】ItemTouchHelper 實(shí)現(xiàn)拖動(dòng)排序 ( 設(shè)置滑動(dòng)方向 | 啟啟用長按拖動(dòng)功能 | 拖動(dòng)距離判定 | 設(shè)置拖動(dòng)觸發(fā)操作 )


文章目錄

  • Android 事件分發(fā) 系列文章目錄
  • 一、ItemTouchHandler 簡介
  • 二、ItemTouchHelper.Callback 自定義實(shí)現(xiàn)
    • 1、設(shè)置移動(dòng)標(biāo)志 ( 拖動(dòng)/滑動(dòng) )
  • 三、完整代碼實(shí)現(xiàn)
    • 1、主界面
    • 2、ItemTouchHelper.Callback 回調(diào)類
  • 四、博客資源





一、ItemTouchHandler 簡介



ItemTouchHandler 是 Google 提供的一個(gè)工具類 , 主要針對 RecyclerView 的上下左右拖動(dòng)事件 進(jìn)行處理 ;

如 : 側(cè)滑刪除 功能 , 條目位置拖動(dòng)交換 功能 , 就可以使用 ItemTouchHandler 實(shí)現(xiàn) ;


如果 RecyclerView 沒有添加 ItemTouchHandler , 只能上下滾動(dòng) , 左右拉動(dòng) , 沒有效果 , 也無法進(jìn)行拖動(dòng)交換條目操作 ;

調(diào)用 ItemTouchHandler 的 attachToRecyclerView 方法 , 傳入想要添加上下左右拖動(dòng)事件的 RecyclerView 對象 , 即可為該 RecyclerView 添加拖動(dòng)事件 ;

添加后 , 該 RecyclerView 自動(dòng)可以進(jìn)行上下左右拖動(dòng)操作 , 用戶可以自行添加相關(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. 添加拖動(dòng)事件Callback callback = new Callback();mItemTouchHelper = new ItemTouchHelper(callback);mItemTouchHelper.attachToRecyclerView(recycler_view);

效果展示 : 此時(shí)還沒有加入上下左右 拖動(dòng)/滑動(dòng) 操作 ;





二、ItemTouchHelper.Callback 自定義實(shí)現(xiàn)



其中的 ItemTouchHelper.Callback 一般都需要開發(fā)者自定義子類實(shí)現(xiàn) ;


1、設(shè)置移動(dòng)標(biāo)志 ( 拖動(dòng)/滑動(dòng) )


重寫 ItemTouchHelper.Callback 的 getMovementFlags 方法 ;

該方法用于設(shè)置上下左右動(dòng)作 , 只有在此處打開了指定方向的設(shè)置 , 才可以應(yīng)用具體方向的拖動(dòng) , 動(dòng)作有兩種 , 一種是滑動(dòng) , 如左右側(cè)滑 ; 一種是拖動(dòng) , 長按后激活拖動(dòng)操作 , 可用于拖動(dòng)交換位置操作 ;

拖動(dòng) / 滑動(dòng) 標(biāo)志位可以使用 ItemTouchHelper.UP | ItemTouchHelper.DOWN , 或運(yùn)算得到想要的標(biāo)志位 ;

將或運(yùn)算結(jié)果傳入 makeMovementFlags 方法 , 第一個(gè)參數(shù)是設(shè)置拖動(dòng)標(biāo)志位 , 第二個(gè)參數(shù)是設(shè)置滑動(dòng)標(biāo)志位 ;


設(shè)置 左右滑動(dòng) , 上下拖動(dòng)代碼如下 :

/*** 設(shè)置上下左右動(dòng)作* 只有在此處打開了指定方向的設(shè)置 , 才可以應(yīng)用具體方向的拖動(dòng)* @param recyclerView* @param viewHolder* @return*/@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {/*設(shè)置拖動(dòng)方向, 此處設(shè)置上下拖動(dòng)事件*/int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;/*設(shè)置滑動(dòng)方向, 此處設(shè)置左右側(cè)滑事件*/int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;// 應(yīng)用 拖動(dòng) 和 滑動(dòng) 設(shè)置return makeMovementFlags(dragFlags, swipeFlags);}

效果展示 :





三、完整代碼實(shí)現(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;/*** 添加拖動(dòng)處理*/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. 添加拖動(dòng)事件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("柴進(jìn)");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è)置上下左右動(dòng)作* 只有在此處打開了指定方向的設(shè)置 , 才可以應(yīng)用具體方向的拖動(dòng)* @param recyclerView* @param viewHolder* @return*/@Overridepublic int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {/*設(shè)置拖動(dòng)方向, 此處設(shè)置上下拖動(dòng)事件*/int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;/*設(shè)置滑動(dòng)方向, 此處設(shè)置左右側(cè)滑事件*/int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;// 應(yīng)用 拖動(dòng) 和 滑動(dò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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。