好的,所以我想为RecyclerView项目制作动画。当我滑动删除项目时,我只想为那些将填充已删除项目的空白空间的项目触发动画。但是以某种方式我无法实现这一点,我什至在使用DiffUtil时,总是得到一个结果,当我用滑动删除项目时,所有项目都会闪烁,并且我想要一个简单的动画,当删除项目时,只有波纹管会出现填满那个空间。有帮助吗?
RecyclerView适配器
class ListAdapter: RecyclerView.Adapter<ListAdapter.ViewHolder>(){
var dataList = emptyList<ToDoData>()
class ViewHolder private constructor(private val binding: CustomRowBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(todo: ToDoData) {
binding.toDoData = todo
binding.executePendingBindings()
}
companion object {
fun from(parent: ViewGroup): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = CustomRowBinding.inflate(layoutInflater, parent, false)
return ViewHolder(
binding
)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder.from(parent)
}
override fun getItemCount(): Int {
return dataList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val currentItem = dataList[position]
holder.bind(currentItem)
}
fun setData(toDoData: List<ToDoData>) {
val diffCallbacks = ToDoDiffCallbacks(dataList, toDoData)
val diffResult = DiffUtil.calculateDiff(diffCallbacks)
this.dataList = toDoData
diffResult.dispatchUpdatesTo(this)
}
}
ToDoDiffCallbacks
class ToDoDiffCallbacks(
private val oldList: List<ToDoData>,
private val newList: List<ToDoData>
) : DiffUtil.Callback() {
override fun getOldListSize(): Int {
return oldList.size
}
override fun getNewListSize(): Int {
return newList.size
}
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition] === newList[newItemPosition]
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
val (id, _, _, _) = oldList[oldItemPosition]
val (id2, _, _, _) = newList[newItemPosition]
return id == id2
}
}
SwipeToDelete
abstract class SwipeToDelete: ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
}
ListFragment
class ListFragment : Fragment(), SearchView.OnQueryTextListener {
private val mToDoViewModel: ToDoViewModel by viewModels()
private val mSharedViewModel: SharedViewModel by viewModels()
private var _binding: FragmentListBinding? = null
private val binding get() = _binding!!
private lateinit var recyclerView: RecyclerView
private val mAdapter: ListAdapter by lazy { ListAdapter() }
private lateinit var deletedItem: ToDoData
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Data Binding
_binding = FragmentListBinding.inflate(inflater, container, false)
binding.lifecycleOwner = this
binding.toDoViewModel = mToDoViewModel
// Setup RecyclerView
setupRecyclerView()
// SwipeToDelete
swipeToDelete()
// Observe for Data changes
mToDoViewModel.allData.observe(viewLifecycleOwner, Observer { data ->
mSharedViewModel.checkDatabase(data)
mAdapter.setData(data)
})
// Add options menu
setHasOptionsMenu(true)
return binding.root
}
private fun setupRecyclerView() {
recyclerView = binding.recyclerView
recyclerView.layoutManager = LinearLayoutManager(requireActivity())
recyclerView.adapter = mAdapter
}
private fun swipeToDelete() {
val swipeToDeleteCallback = object : SwipeToDelete() {
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
deletedItem = mAdapter.dataList[viewHolder.adapterPosition]
showSnackBar(viewHolder.itemView, deletedItem, viewHolder.adapterPosition)
}
}
val itemTouchHelper = ItemTouchHelper(swipeToDeleteCallback)
itemTouchHelper.attachToRecyclerView(recyclerView)
}
// Show Snack Bar to inform user about Item removal
fun showSnackBar(view: View, deletedItem: ToDoData, position: Int) {
mToDoViewModel.deleteItem(deletedItem)
mAdapter.notifyItemRemoved(position)
val snack = Snackbar.make(
view, "Deleted '${deletedItem.title}'",
Snackbar.LENGTH_LONG)
snack.setAction("Undo") {
mToDoViewModel.insert(deletedItem)
mAdapter.notifyItemChanged(position) }
snack.show()
}
}