[英]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.