簡體   English   中英

帶有 LayoutBinding 的 RecyclerView - 滑動刪除 - 留下項目大小的空白空間

[英]RecyclerView with LayoutBinding - Swipe to remove - Leaves empty space of item size

我在網上搜索了很多,但顯然無法找到答案。 我有一個待辦事項列表,並且適配器附加了滑動功能,因此當有人滑動該項目時,它會從列表中刪除該項目。

問題是刪除的項目被新項目替換,但該區域顯示為空白區域。

在此處輸入圖片說明

我知道那里有行項目但沒有顯示,如果我關閉應用程序並再次打開它會顯示出來。

這是我的適配器類。

@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
class TodoAdapter(var allTodos: ArrayList<Todo>, var callback: iTodoAdapter)
: RecyclerView.Adapter<TodoAdapter.TodoViewHolder>(),
ItemTouchHelperCustomListener {

//Hello
override fun onItemDismiss(position: Int) {
    callback.onDelete(position)
}

override fun onItemMove(fromPosition: Int, toPosition: Int) : Boolean {
    callback.onItemsSwapped(fromPosition, toPosition)
    return true
}

override fun updateDatabasePositions(fromPosition: Int, toPosition: Int) {
    val size = allTodos.size - 1
    for (index in 0..size) {
        allTodos.get(index).position = index
    }
    callback.onPositionsUpdated()
}


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : TodoViewHolder {
    val binding = LayoutTodoItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    return TodoViewHolder(binding)
}

override fun getItemCount(): Int {
    return allTodos.size
}

private fun createOnClickListener(position: Int) : View.OnClickListener {
    return View.OnClickListener {
        val checked = (it as CheckBox).isChecked
        allTodos.get(position).isSelected = checked
        allTodos.get(position).let { callback.onItemUpdated(it) }
    }
}


override fun onBindViewHolder(holder: TodoViewHolder, position: Int) {
    holder.bind(allTodos.get(position), createOnClickListener(position))
}

//We only have 1 type of item
override fun getItemViewType(position: Int): Int {
    return position
}

class TodoViewHolder(private val binding : LayoutTodoItemBinding) :
    RecyclerView.ViewHolder(binding.root) {

    fun bind(todoItem : Todo?, clickListner: View.OnClickListener) {
        binding.apply {
            setTodoItem(todoItem)
            onClickListener = clickListner
            executePendingBindings()
        }
    }
}

fun getData() : ArrayList<Todo> {
    return this.allTodos
}


interface iTodoAdapter {
    fun onDelete(position: Int)
    fun onItemsSwapped(from: Int, to: Int)
    fun onPositionsUpdated()
    fun onItemUpdated(item: Todo)
}
}

這是我在片段中實現的 iTodoAdapter

override fun onDelete(position: Int) {
    viewModel.delete(allTodos.get(position))
}

override fun onItemsSwapped(from: Int, to: Int) {
    Collections.swap(allTodos, from, to)
    rcyTodo?.adapter?.notifyDataSetChanged()
}

override fun onPositionsUpdated() {
    viewModel.updateAll((rcyTodo?.adapter as TodoAdapter).getData())
}

override fun onItemUpdated(item: Todo) {
    viewModel.update(item)
}

這是我的片段設置:

    val dividerItemDecoration = DividerItemDecoration(rcyTodo.context,DividerItemDecoration.VERTICAL)
    rcyTodo.addItemDecoration(dividerItemDecoration)

    rcyTodo.apply {
        adapter = TodoAdapter(allTodos, this@Todo)
        setHasFixedSize(true)
    }

    setupSwipeToDelete()
    setCurrentItems()

以下是功能

private fun setupSwipeToDelete() {
    val itemTouchHelperCallback = ItemTouchHelperCallback(rcyTodo.adapter as TodoAdapter)
    val itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback)
    itemTouchHelper.attachToRecyclerView(rcyTodo)
}

@SuppressLint("CheckResult")
private fun setCurrentItems() {
    viewModel.getAllTodos().subscribe({
        allTodos.clear()
        allTodos.addAll(it)
        rcyTodo?.recycledViewPool?.clear()
        rcyTodo?.adapter?.notifyDataSetChanged()
    }, {

    })
}

我發現在某個地方清除池 (rcyTodo?.recycledViewPool?.clear()) 應該重繪項目但不起作用。

我在想我是否必須刪除布局綁定並以簡單的方式進行? 有辦法解決嗎? 我錯過了什么嗎? 順便說一下,空白區域確實有項目,這只發生在我滑動后刪除一個項目時。 與繪制元素有關,不知何故回收者視圖認為這個位置應該是空的。

使用您的notifyDataSetChanged ,在適配器上再調用一個函數 - notifyItemRemoved(position) 文檔說:

通知任何已注冊的觀察者先前位於該位置的項目已從數據集中刪除。 以前位於和之后位置的項目現在可以在 oldPosition - 1 中找到。

希望它能成功:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM