Tuesday, 7 September 2021

RecyclerView animation issue Android Kotlin

I have added an animation to the recyclerview to show the below transition.

When I long press on an item it shows the radio button and the item card moves to the right. The issue is that after the initial selection when ever I click or select other items, item6 and the items below animates again.

Can someone explain why this is happening and how I can fix this.

enter image description here

ListAdapter.kt:

class ListItemAdapter(private val values: List<PlaceholderContent.PlaceholderItem>
) : RecyclerView.Adapter<ListItemAdapter.ItemViewHolder>() {

    private lateinit var itemClick: OnItemClick
    private var selectedIndex: Int = -1
    private var selectedItems: SparseBooleanArray = SparseBooleanArray()
    private var isActive: Boolean = false
    private var activateAnimation: Boolean = false

    fun setItemClick(itemClick: OnItemClick) {
        this.itemClick = itemClick
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): ListItemAdapter.ItemViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(
            R.layout.fragment_item,
            parent,
            false
        )
        return ItemViewHolder(view)
    }

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        holder.itemView.apply {
            findViewById<TextView>(R.id.item_number).text = values[position].id
            findViewById<TextView>(R.id.content).text = values[position].content
        }

        holder.itemView.findViewById<CardView>(R.id.list_item).setOnClickListener {
            itemClick.onItemClick(values[position], position)
        }

        holder.itemView.findViewById<CardView>(R.id.list_item).setOnLongClickListener {
            itemClick.onLongPress(values[position], position)
            true
        }

        toggleIcon(holder, position)
    }

    override fun getItemCount(): Int {
        return values.size
    }
    
    private fun itemTransition(holder: ItemViewHolder){
        val animator = ObjectAnimator.ofFloat(holder.itemView.findViewById(R.id.list_item), View.TRANSLATION_X, 150f)
        animator.start()
    }

    private fun itemTransitionBack(holder: ItemViewHolder){
        val animator = ObjectAnimator.ofFloat(holder.itemView.findViewById(R.id.list_item), View.TRANSLATION_X, 0f)
        animator.start()
    }


    fun toggleIcon(holder: ItemViewHolder, position: Int){
        val checkBox = holder.itemView.findViewById<RadioButton>(R.id.is_selected)
        if(selectedItems.get(position, false)){
            checkBox.isGone = false
            checkBox.isChecked = true
        }
        else{
            checkBox.isGone = true
            checkBox.isChecked = false
        }
        if(isActive) checkBox.isGone = false

        if(activateAnimation){
            itemTransition(holder)
        }
        else
            itemTransitionBack(holder)

        if(selectedIndex == position) selectedIndex = - 1
    }

    fun selectedItemCount() = selectedItems.size()

    fun toggleSelection(position: Int){

        selectedIndex = position
        if (selectedItems.get(position, false)){
            selectedItems.delete(position)
        }else {
            selectedItems.put(position, true)
        }
        notifyItemChanged(position)

        isActive = selectedItems.isNotEmpty()
        activateAnimation = selectedItems.isNotEmpty()
        notifyDataSetChanged()
    }

    fun clearSelection(){
        selectedItems.clear()
        notifyDataSetChanged()
    }

    interface OnItemClick {
        fun onItemClick(item: PlaceholderContent.PlaceholderItem, position: Int)
        fun onLongPress(item: PlaceholderContent.PlaceholderItem, position: Int)
    }

    inner class ItemViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
    }

}

ItemFragment.kt

adapter = ListItemAdapter(PlaceholderContent.ITEMS)
val recyclerViewList = view.findViewById<RecyclerView>(R.id.list)
recyclerViewList.adapter = adapter
recyclerViewList.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.VERTICAL, false)
val myHelper = ItemTouchHelper(myCallback)
myHelper.attachToRecyclerView(recyclerViewList)

adapter.setItemClick(object : ListItemAdapter.OnItemClick{
    override fun onItemClick(
        item: PlaceholderContent.PlaceholderItem,
        position: Int
    ) {
        if(adapter.selectedItemCount() > 0)
            toggleSelection(position)
    }

    override fun onLongPress(
        item: PlaceholderContent.PlaceholderItem,
        position: Int
    ) {
        toggleSelection(position)
    }

})

private fun toggleSelection(position: Int){
    adapter.toggleSelection(position)
}


from RecyclerView animation issue Android Kotlin

No comments:

Post a Comment