android - 从适配器数据中删除项目后,ItemTouchHelper 不滑动

标签 android kotlin android-recyclerview

使用 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/

相关文章:

android - 在android中自动清除应用程序更新时的用户缓存

Android - 重复更改选项卡和 ListView 项目

kotlin - 如何乘以 Kotlin 范围内的所有整数值?

spring-boot - GraphQl:对象类型 "xxx"实现了一个已知接口(interface),但找不到该类型名称的类

android - 多个 RecyclerView 不能在同一个 fragment 中工作

android - 每秒刷新 ListView 项目

Android Studio 3.5 版抽屉导航

java - 使用 Controller/MVC 初始化 RecyclerView

java - 如何使用 Groupie RecyclerView 库和 Kotlin 删除项目时通知和更新列表

从 Playstore 与 Launcher 行为的 Android 打开应用程序