简体   繁体   English

Android Recyclerview 移除动画适用于所有项目的奇怪行为

[英]Android Recyclerview Remove Animation Is Applied To All Items Strange Behaviour

I am using following library to animate items in my recyclerview on removal https://github.com/wasabeef/recyclerview-animators我正在使用以下库在删除https://github.com/wasabeef/recyclerview-animators 时为我的 recyclerview 中的项目设置动画

I am trying to apply slide to right animation to only removed item but for some reason all items in recyclerview disappears first and then animated back to their position strangely.我试图将滑动到正确的动画应用于仅删除的项目,但由于某种原因,recyclerview 中的所有项目首先消失,然后奇怪地动画回到它们的位置。 Please watch the following video.请观看以下视频。 在此处输入图片说明

Here is my code its very simple:这是我的代码,非常简单:

   friends_screen_friendlist_recyclerview.itemAnimator = SlideInRightAnimator()
                   friends_screen_friendlist_recyclerview.itemAnimator?.apply {
                        addDuration = 120;
                       removeDuration = 1000;
                        moveDuration = 500;
                        changeDuration = 500;
                   }
    friendItems.removeAt(0)

               friends_screen_friendlist_recyclerview.adapter!!.notifyItemRemoved(0)

Adapter class:适配器类:

class FriendListAdapter(val items : ArrayList<FriendListItem>, val context: Context,val listener:FriendListListener) : androidx.recyclerview.widget.RecyclerView.Adapter<FriendListViewHolder>(),Filterable {

    var filterItems = ArrayList<FriendListItem>()

    init{
        filterItems = items
    }
    // Gets the number of animals in the list
    override fun getItemCount(): Int {
        return filterItems.size
    }
    override fun getItemViewType(position: Int): Int {
        return position
    }

    override fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(constraint: CharSequence?): FilterResults {
                val charSearch = constraint.toString()
                if (charSearch.isEmpty()) {
                    filterItems = items
                } else {
                    val resultList = ArrayList<FriendListItem>()
                    for (row in items) {
                        if (row.userName.toLowerCase(Locale.ROOT).contains(charSearch.toLowerCase(Locale.ROOT))) {
                            resultList.add(row)
                        }
                    }
                    filterItems = resultList
                }
                val filterResults = FilterResults()
                filterResults.values = filterItems
                return filterResults
            }

            @Suppress("UNCHECKED_CAST")
            override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
                filterItems = results?.values as ArrayList<FriendListItem>
                notifyDataSetChanged()
            }

        }
    }

    // Inflates the item views
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FriendListViewHolder {
        return FriendListViewHolder(LayoutInflater.from(context).inflate(R.layout.friendlist_item, parent, false))
    }

    // Binds each animal in the ArrayList to a view
    override fun onBindViewHolder(holder: FriendListViewHolder, position: Int) {
        //holder?.profileImage?.background = items[position].profileImage
        holder?.userName?.text = filterItems[position].userName
        holder?.level?.text = "Seviye "+filterItems[position].level

        // do the necessary profilePic checks.
        Picasso.get().load(filterItems[position].profileImage).into(holder?.profileImage, object : Callback {
            override fun onSuccess() {
                listener.onProfilePicLoaded()
            }

            override fun onError(e: Exception?) {
                listener.onProfilePicLoaded() // error but anyway. just tell messages class its loaded so it can show the page.

            }
        })


  if(filterItems[position].gender == 0){
            holder?.gender?.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.male_icon))
        }else{
            holder?.gender?.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.female_icon))

        }

        if(filterItems[position].isOnline){
            holder?.isOnline?.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.online_circle))
        }else{
            holder?.isOnline?.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.offline_circle))

        }


        holder.itemContainer.setOnClickListener {
            listener.onFriendSelected(filterItems[position])


        }
        holder.itemContainer.setOnLongClickListener {
            listener.onFriendSelectedAndHolded(filterItems[position],position)
            Log.d("yunusdebug","long")


            return@setOnLongClickListener true

        }


    }


}

class FriendListViewHolder (view: View) : androidx.recyclerview.widget.RecyclerView.ViewHolder(view) {
    // Holds the TextView that will add each animal to
    val itemContainer = view.friendlist_item_container

    val userName = view.friendlist_item_username_textview

    val level = view.friendlist_item_level_textview
    val isOnline = view.friendlist_item_isOnline
    val profileImage = view.friendlist_item_profile_image
    val gender = view.friendlist_item_gender

}

When you remove an item in your adapter you should also notify the new range.当您删除适配器中的项目时,您还应该通知新范围。 Please try the following:请尝试以下操作:

friendItems.removeAt(index)
notifyItemRemoved(index)
notifyItemRangeChanged(index,friendItems.size)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM