使用 ItemTouchHelper
从适配器中删除项目时遇到问题。当通过 updateItemRemoved()
滑动并删除第一个项目时,无法滑动任何其他项目。看起来在第一次移除任何项目后,“忽略”剩余项目的滑动。
适配器:
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) }
}
}
如果我不调用 data.removeAt(position)
,则删除会继续进行其他滑动
最佳答案
发现问题是由 getMovementFlags()
函数中的 adapter?.itemCount ?: 0 == 1
直接引起的。因此,当 itemCount
等于 1 时,最后一个项目的状态将设置为 IDLE
-> 0。删除此功能,因此它不会操纵项目的状态解决了它。
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
) = if (adapter?.itemCount ?: 0 == 1 && viewHolder.layoutPosition == 0) 0
else super.getMovementFlags(recyclerView, viewHolder)
关于android - 从适配器数据中删除项目后,ItemTouchHelper 不滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64276289/