Skip to content
This repository was archived by the owner on Jul 16, 2024. It is now read-only.

Commit 1ede62f

Browse files
committed
添加 ItemTouchHelperCallback 支持拖拽和删除
1 parent 5b9ba03 commit 1ede62f

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package io.goooler.demoapp.adapter.rv.core
2+
3+
import androidx.recyclerview.widget.ItemTouchHelper
4+
import androidx.recyclerview.widget.RecyclerView
5+
6+
class ItemTouchHelperCallback(
7+
private val listener: ItemChangeListener,
8+
private val longPressDragEnabled: Boolean = true,
9+
private val itemViewSwipeEnabled: Boolean = false
10+
) : ItemTouchHelper.Callback() {
11+
12+
override fun isLongPressDragEnabled(): Boolean = longPressDragEnabled
13+
14+
override fun isItemViewSwipeEnabled(): Boolean = itemViewSwipeEnabled
15+
16+
override fun getMovementFlags(
17+
recyclerView: RecyclerView,
18+
viewHolder: RecyclerView.ViewHolder
19+
): Int {
20+
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or
21+
ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
22+
val swipeFlags = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
23+
return makeMovementFlags(dragFlags, swipeFlags)
24+
}
25+
26+
override fun onMove(
27+
recyclerView: RecyclerView,
28+
from: RecyclerView.ViewHolder,
29+
to: RecyclerView.ViewHolder
30+
): Boolean {
31+
listener.onItemMove(from.bindingAdapterPosition, to.bindingAdapterPosition)
32+
return true
33+
}
34+
35+
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
36+
listener.onItemDismiss(viewHolder.bindingAdapterPosition)
37+
}
38+
39+
interface ItemChangeListener {
40+
41+
fun onItemMove(fromPosition: Int, toPosition: Int)
42+
43+
fun onItemDismiss(position: Int)
44+
}
45+
}

main/src/main/kotlin/io/goooler/demoapp/main/ui/fragment/MainSrlFragment.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package io.goooler.demoapp.main.ui.fragment
22

33
import android.view.View
4+
import androidx.recyclerview.widget.ItemTouchHelper
45
import com.scwang.smart.refresh.layout.api.RefreshLayout
56
import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
67
import dagger.hilt.android.AndroidEntryPoint
8+
import io.goooler.demoapp.adapter.rv.core.ItemTouchHelperCallback
79
import io.goooler.demoapp.base.util.unsafeLazy
810
import io.goooler.demoapp.common.base.BaseThemeLazyFragment
911
import io.goooler.demoapp.common.util.enableRefreshAndLoadMore
@@ -37,11 +39,14 @@ class MainSrlFragment : BaseThemeLazyFragment<MainSrlFragmentBinding>() {
3739
it.refreshLayout.setOnRefreshLoadMoreListener(listener)
3840
it.rvList.adapter = rvAdapter
3941
}
42+
ItemTouchHelper(ItemTouchHelperCallback(listener, itemViewSwipeEnabled = true))
43+
.attachToRecyclerView(binding.rvList)
4044
}
4145

4246
private val listener = object :
4347
MainSrlRvAdapter.OnEventListener,
4448
OnRefreshLoadMoreListener,
49+
ItemTouchHelperCallback.ItemChangeListener,
4550
View.OnClickListener {
4651
override fun onContentClick(content: String) {
4752
content.showToast()
@@ -55,6 +60,14 @@ class MainSrlFragment : BaseThemeLazyFragment<MainSrlFragmentBinding>() {
5560
vm.loadMore()
5661
}
5762

63+
override fun onItemMove(fromPosition: Int, toPosition: Int) {
64+
vm.swapItems(fromPosition, toPosition)
65+
}
66+
67+
override fun onItemDismiss(position: Int) {
68+
vm.deleteItem(position)
69+
}
70+
5871
override fun onClick(v: View) {
5972
when (v.id) {
6073
R.id.iv_error, R.id.tv_tip -> {

main/src/main/kotlin/io/goooler/demoapp/main/vm/MainSrlViewModel.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import io.goooler.demoapp.common.base.BaseRxViewModel
77
import io.goooler.demoapp.common.type.CommonConstants
88
import io.goooler.demoapp.main.model.MainCommonVhModel
99
import io.goooler.demoapp.main.repository.MainCommonRepository
10+
import java.util.Collections
1011
import javax.inject.Inject
1112

1213
@HiltViewModel
@@ -38,6 +39,16 @@ class MainSrlViewModel @Inject constructor(private val repository: MainCommonRep
3839
fetchListData(page)
3940
}
4041

42+
fun swapItems(fromPosition: Int, toPosition: Int) {
43+
Collections.swap(_listData, fromPosition, toPosition)
44+
listData.value = _listData
45+
}
46+
47+
fun deleteItem(position: Int) {
48+
_listData.removeAt(position)
49+
listData.value = _listData
50+
}
51+
4152
private fun fetchListData(page: Int) {
4253
repository.getRepoListWithRx("goooler", page)
4354
.doFinally(::finishRefreshAndLoadMore)

0 commit comments

Comments
 (0)