当前位置:网站首页>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
}
}
}
}边栏推荐
- MFC interface library bcgcontrolbar v33.0 - Desktop alert window, grid control upgrade
- How to temporarily modify samesite=none and secure in Chrome browser
- CPDA|数据分析师需要具备哪些基本功?
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle
- 记一些PAT题目(一)
- 尚硅谷 尚硅谷 | 什么是ClickHouse表引擎 Memory和Merge
- Clustering, dimension reduction and measurement techniques for machine learning
- API de table & SQL et module d'échantillon pour le système Flink
- R语言使用epiDisplay包的statStack函数基于因子变量通过分层的方式查看连续变量的统计量(均值、中位数等)以及对应的假设检验
- 将图片背景设置为透明的方法介绍
猜你喜欢
![Dynamic programming [II] (linear DP)](/img/c9/f4fbc78d24320e3bd915d99de5837b.jpg)
Dynamic programming [II] (linear DP)

Introduction to setting program icon in QT

yolov5训练自己的数据集报错记录

API interface for discharge summary identification - medical bill OCR identification / discharge diagnosis record / electronic medical record / claim settlement service

如何在Chrome浏览器中临时修改SameSite=None和Secure

API de table & SQL et module d'échantillon pour le système Flink

HMS Core机器学习服务身份证识别功能,实现信息高效录入

WMS仓库仓储管理系统源码

SQL operation: with expression and its application

出院小结识别api接口-医疗票据OCR识别/出院诊断记录/电子病历/理赔服务
随机推荐
WMS仓库仓储管理系统源码
Two problems that may occur in the use of ThreadLocal and thread pool
Dynamic programming [1] (knapsack problem)
Nepal graph has settled in Alibaba cloud computing nest to help enterprises build a super large-scale map database on the cloud
The R language catiols package divides the data, randomforest package constructs the random forest model, uses the importance function to calculate the importance of each feature in the random forest
剑指 Offer II 029. 排序的循环链表
Notez quelques questions Pat (1)
Write down some pat topics (I)
Manjaro installs the downloaded TTF font file
nacos-配置中心-源码
网管型全国产加固交换机如何创建网络冗余
QT creator 7.0 frequently asked questions and common usage
[high frequency interview questions] difficulty 1/5, popular enumeration simulation questions
R语言使用epiDisplay包的statStack函数基于因子变量通过分层的方式查看连续变量的统计量(均值、中位数等)以及对应的假设检验
HMS Core机器学习服务身份证识别功能,实现信息高效录入
JVM内存结构
Tableapi & SQL and example module of Flink
Use the uniapp framework to build the zheliban micro application (single sign on, embedded point, aging adaptation, RPC gateway)
linux-mysql-命令
Codeforces Round #394 (Div. 2) E. Dasha and Puzzle