have an issue with removing items from adapter using ItemTouchHelper
. When first item is swiped and removed via updateItemRemoved()
any other cannot be swiped. Looks like swiping for remaining items is "ignored" after first removal of any item.
Adapter:
class Adapter: RecyclerView.Adapter<BaseUserVH>() {
private var data: List<User> = listOf()
private var activeUserPosition = 0
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when (viewType) {
R.layout.active -> ActiveVH(parent.inflateView(R.layout.active))
else -> InactiveVH(parent.inflateView(R.layout.inactive))
}
override fun getItemCount(): Int = data.size
override fun onBindViewHolder(holder: BaseUserVH, position: Int) = holder.bind(data[position])
override fun getItemViewType(position: Int) =
if (position == activeUserPosition ) R.layout.active
else R.layout.inactive
fun selectUser(position: Int) {
activeUserPosition = position
notifyItemChanged(position)
}
fun setData(users: List<User>) {
data = users
notifyDataSetChanged()
}
fun updateItemRemoved(position: Int) {
data.removeAt(position)
notifyItemRemoved(position)
notifyItemRangeChanged(position, itemCount)
}
}
ItemTouchHelper & Fragment:
fun RecyclerView.swipeToDelete(
onSwiped: (Int) -> Unit
) {
val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
onSwiped(viewHolder.layoutPosition)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
) = false
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
) = if (adapter?.itemCount ?: 0 == 1 && viewHolder.layoutPosition == 0) 0
else super.getMovementFlags(recyclerView, viewHolder)
val itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback)
itemTouchHelper.attachToRecyclerView(this)
}
class Fragment : Fragment() {
private val userAdapter = Adapter()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(
R.layout.fragment,
container,
false
).apply {
with(recycler) {
adapter = userAdapter
swipeToDelete { position -> userAdapter.updateItemRemoved(position) }
}
}
If I don't call data.removeAt(position)
, then deletion keeps going for other swipes
from ItemTouchHelper not swiping after item removed from adapter data
No comments:
Post a Comment