Recyclerview项目动画闪烁

时间:2020-06-25 14:56:13

标签: android kotlin

好的,所以我想为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()
    }

}

0 个答案:

没有答案
相关问题