ItemTouchHelper在适配器数据删除后无法滑动。

3

我在使用ItemTouchHelper移除adapter中的元素时遇到问题。当第一个元素通过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),那么删除操作将继续进行,直到执行其他滑动。
1个回答

3
发现问题直接由 `adapter?.itemCount ?: 0 == 1` 在 `getMovementFlags()` 函数中引起。所以当 `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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接