当前位置:网站首页>Recycleview drag effect
Recycleview drag effect
2022-06-21 19:58:00 【yufumatou】
Preface : be based on RecycleView Achieve drag effect , It's very simple , Just use the... Provided by the system ItemTouchHelper Can meet most needs .

Realization :
1、 establish ItemTouchHelper, stay CallBack To deal with business
(1)getMovementFlags() Set allow drag 、 The direction of the slide
(2)onMove() The drag process keeps calling , In exchange for item
(3)onSelectedChanged() Long press to select callback , Can be used as a highlight for the selected background
(4)clearView() End drag callback , Can be used to restore the selected background
2、 relation RecycleView, Give sliding ability
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tableList = ArrayList<String>()
for (i in 1..200) {
tableList.add(" table (${i})")
}
rv_table.layoutManager = GridLayoutManager(this, 5)
TableAdapter().let {
it.mTableList = tableList
rv_table.adapter = it
}
val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
// Drag direction
val dargFlags =
ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT or ItemTouchHelper.UP or ItemTouchHelper.DOWN
// Sliding direction
val swipeFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
// Set drag 、 Sliding direction
return makeMovementFlags(dargFlags, swipeFlags)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
// Drag the ViewHolder Location
val fromPosition = viewHolder.adapterPosition
// After the ViewHolder Location
val toPosition = target.adapterPosition
when{
fromPosition < toPosition -> {// Drag backwards , And location +1 swapping
for (i in fromPosition..toPosition) {
Collections.swap(tableList, i, i + 1)
}
recyclerView.adapter?.notifyItemMoved(fromPosition, toPosition)
}
fromPosition > toPosition -> {// Drag forward , And location -1 swapping
for (i in fromPosition..toPosition) {
Collections.swap(tableList, i, i - 1)
}
recyclerView.adapter?.notifyItemMoved(fromPosition, toPosition)
}
}
return true
}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
super.onSelectedChanged(viewHolder, actionState)
// Long press to select the... To be dragged ViewHolder Background color
(viewHolder as? TableAdapter.TableViewHolder)?.tvTabe?.setBackgroundResource(R.color.colorPrimary)
}
override fun clearView(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
) {
super.clearView(recyclerView, viewHolder)
(viewHolder as TableAdapter.TableViewHolder).tvTabe.setBackgroundResource(R.color.colorAccent)
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}
})
// give RecycleView Drag capability
itemTouchHelper.attachToRecyclerView(rv_table)
}Advanced
Scene one : Prohibited part item Drag the ( As the first 1 Items cannot be dragged )
1、 Disable the default drag :CallBack in isLongPressDragEnabled() return false
2、 In the custom implementation item Long press the event , Execute the drag operation for those that meet the conditions
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tableList = ArrayList<String>()
for (i in 1..200) {
tableList.add(" table (${i})")
}
rv_table.layoutManager = GridLayoutManager(this, 5)
val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
// Drag direction
val dargFlags =
ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT or ItemTouchHelper.UP or ItemTouchHelper.DOWN
// Sliding direction
val swipeFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
// Set drag 、 Sliding direction
return makeMovementFlags(dargFlags, swipeFlags)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
// Drag the ViewHolder Location
val fromPosition = viewHolder.adapterPosition
// After the ViewHolder Location
val toPosition = target.adapterPosition
when{
fromPosition < toPosition -> {// Drag backwards , And location +1 swapping
for (i in fromPosition..toPosition) {
Collections.swap(tableList, i, i + 1)
}
recyclerView.adapter?.notifyItemMoved(fromPosition, toPosition)
}
fromPosition > toPosition -> {// Drag forward , And location -1 swapping
for (i in fromPosition..toPosition) {
Collections.swap(tableList, i, i - 1)
}
recyclerView.adapter?.notifyItemMoved(fromPosition, toPosition)
}
}
return true
}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
super.onSelectedChanged(viewHolder, actionState)
// Long press to select the... To be dragged ViewHolder Background color
(viewHolder as? TableAdapter.TableViewHolder)?.tvTabe?.setBackgroundResource(R.color.colorPrimary)
}
override fun clearView(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
) {
super.clearView(recyclerView, viewHolder)
(viewHolder as TableAdapter.TableViewHolder).tvTabe.setBackgroundResource(R.color.colorAccent)
}
override fun isLongPressDragEnabled(): Boolean {
// Disable default drag
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}
})
// give RecycleView Sliding capacity
itemTouchHelper.attachToRecyclerView(rv_table)
TableAdapter().let {
it.mTableList = tableList
rv_table.adapter = it
// Pass the drag function to Adapter
it.mItemTouchHelper = itemTouchHelper
}
}class TableAdapter : RecyclerView.Adapter<TableAdapter.TableViewHolder>(){
var mTableList = ArrayList<String>()
var mItemTouchHelper: ItemTouchHelper? = null
override fun getItemCount(): Int {
return mTableList.size
}
override fun onBindViewHolder(holder: TableViewHolder, position: Int) {
val table = mTableList[position]
holder.tvTabe.text = table
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TableViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_table, parent, false)
return TableViewHolder(view)
}
inner class TableViewHolder constructor(view: View): RecyclerView.ViewHolder(view) {
val tvTabe = view.findViewById<TextView>(R.id.tv_table)
init {
tvTabe.setOnLongClickListener {
if (this.adapterPosition != 0){
mItemTouchHelper?.startDrag(this)
[email protected] true
}
[email protected] false
}
}
}
}Scene two : Just drag the item And final position item swapping , The path location remains unchanged
1、 stay onMove() Record the passed position to the dragged ViewHolder in
2、 stay clearView() Position exchange in
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tableList = ArrayList<String>()
for (i in 1..200) {
tableList.add(" table (${i})")
}
rv_table.layoutManager = GridLayoutManager(this, 5)
val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
// Drag direction
val dargFlags =
ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT or ItemTouchHelper.UP or ItemTouchHelper.DOWN
// Sliding direction
val swipeFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
// Set drag 、 Sliding direction
return makeMovementFlags(dargFlags, swipeFlags)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
// After the ViewHolder The position is saved to the dragged ViewHolder in
val toPosition = target.adapterPosition
(viewHolder as TableAdapter.TableViewHolder).toPosition = toPosition
return true
}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
super.onSelectedChanged(viewHolder, actionState)
// Long press to select the... To be dragged ViewHolder Background color
(viewHolder as? TableAdapter.TableViewHolder)?.tvTabe?.setBackgroundResource(R.color.colorPrimary)
}
override fun clearView(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
) {
super.clearView(recyclerView, viewHolder)
(viewHolder as TableAdapter.TableViewHolder).tvTabe.setBackgroundResource(R.color.colorAccent)
// Drag the ViewHolder Location
val fromPosition = viewHolder.adapterPosition
// Final position
val toPosition = viewHolder.toPosition
if (toPosition >= 0){
Collections.swap(tableList, fromPosition, toPosition)
recyclerView.adapter?.let{
it.notifyItemChanged(fromPosition)
it.notifyItemChanged(toPosition)
}
}
}
override fun isLongPressDragEnabled(): Boolean {
// Disable default drag
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}
})
// give RecycleView Sliding capacity
itemTouchHelper.attachToRecyclerView(rv_table)
TableAdapter().let {
it.mTableList = tableList
rv_table.adapter = it
// Pass the drag function to Adapter
it.mItemTouchHelper = itemTouchHelper
}
}class TableAdapter : RecyclerView.Adapter<TableAdapter.TableViewHolder>(){
var mTableList = ArrayList<String>()
var mItemTouchHelper: ItemTouchHelper? = null
override fun getItemCount(): Int {
return mTableList.size
}
override fun onBindViewHolder(holder: TableViewHolder, position: Int) {
val table = mTableList[position]
holder.tvTabe.text = table
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TableViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_table, parent, false)
return TableViewHolder(view)
}
inner class TableViewHolder constructor(view: View): RecyclerView.ViewHolder(view) {
val tvTabe = view.findViewById<TextView>(R.id.tv_table)
var toPosition = -1
init {
tvTabe.setOnLongClickListener {
if (this.adapterPosition != 0){
mItemTouchHelper?.startDrag(this)
[email protected] true
}
[email protected] false
}
}
}
}边栏推荐
- inno setup 安装路径框学习
- Medical expense list can be entered at a second speed, and OCR recognition can help double the efficiency
- 出院小结识别api接口-医疗票据OCR识别/出院诊断记录/电子病历/理赔服务
- Qt Creator 7.0常见问题和常见用法
- HMS core machine learning service ID card identification function to achieve efficient information entry
- TensorFlow 2:使用神经网络对Fashion MNIST分类并进行比较分析
- R语言使用epiDisplay包的followup.plot函数可视化多个ID(病例)监测指标的纵向随访图、使用line.col参数自定义曲线的颜色(色彩)
- W10添加系统环境变量Path
- 决策树的实现和调优(sklearn,GridSearchCV)
- 文件上传漏洞靶场分析 UPLOAD_LABS
猜你喜欢

动态规划【一】(背包问题)

WMS仓库仓储管理系统源码

机器学习之神经网络与支持向量机

出院小结识别api接口-医疗票据OCR识别/出院诊断记录/电子病历/理赔服务

Nepal graph has settled in Alibaba cloud computing nest to help enterprises build a super large-scale map database on the cloud

Source code analysis of ArrayList

JVM内存结构

After the 80 version of Google browser, how to deal with the problem samesite cross domain problem

Medical expense list can be entered at a second speed, and OCR recognition can help double the efficiency

NPDP|如何做好产品生命周期管理?
随机推荐
RecycleView懒加载失效问题
Use the uniapp framework to build the zheliban micro application (single sign on, embedded point, aging adaptation, RPC gateway)
The GLM function of R language is used to build a binary logistic regression model (the family parameter is binomial), and the summary function is used to view the summary statistical information of t
将图片背景设置为透明的方法介绍
转发提醒 MetaMask小狐狸钱包安全公告 如何应对拓展程序潜在的私钥泄露
[high frequency interview questions] difficulty 1/5, popular enumeration simulation questions
Two ways of encrypting Excel files
Source code analysis of ArrayList
如何在Chrome浏览器中模拟请求或修改请求的域名
CloudCompare&PCL 点云点匹配(基于欧式距离)
出院小结识别api接口-医疗票据OCR识别/出院诊断记录/电子病历/理赔服务
根据数据中的key获取value值
After the 80 version of Google browser, how to deal with the problem samesite cross domain problem
网管型全国产加固交换机如何创建网络冗余
MySQL必知必会-第九章-用正则表达式进行搜索
婴儿名字[连通分量之邻接矩阵与DFS]
Flink 系例 之 TableAPI & SQL 與 示例模塊
inno setup 窗口拖动学习
Sword finger offer II 029 Sorted circular linked list
机器学习之模型评估与选择