简体   繁体   中英

Long Click is not working in recyclerview - kotlin

I need to enable selection mode when the item is long clicked and disable it when the selection list is empty . on click is working fine but long click is not working properly

    class FolderRAdapter(
    var list: ArrayList<Image>,
    var folderInteractionListener: FolderInteractionListener
) :
    RecyclerView.Adapter<FolderRAdapter.BaseViewHolder>() {
    var selectedList = HashSet<Image>()
    val selectionViewType = 1
    val nonSelectionViewType = 2

    var isSelectionMode = false

    inner class FolderRViewHolder(
        view: View
    ) : BaseViewHolder(view), View.OnClickListener, View.OnLongClickListener {
        init {
            view.isLongClickable = true
            view.isClickable = true
            view.setOnClickListener(this)
            view.setOnLongClickListener(this)
        }

        override fun onClick(v: View?) {
            folderInteractionListener.onItemClicked(list[adapterPosition])
        }

        override fun onLongClick(v: View?): Boolean {
            isSelectionMode = true
            return true
        }
    }

    inner class SelectionViewHolder(
        view: View
    ) : BaseViewHolder(view), View.OnClickListener {
        init {
            view.setOnClickListener(this)
            view.checkbox.setOnClickListener(this)
        }

        override fun onClick(view: View?) {
            val image = list[adapterPosition]
            if (selectedList.contains(image)) {
                view?.checkbox?.isChecked = false
                view?.checkbox_container?.setBackgroundColor(0)
                selectedList.remove(list[adapterPosition])

            } else {
                selectedList.add(list[adapterPosition])
                view?.checkbox?.isChecked = true
                view?.checkbox_container?.setBackgroundColor(Color.parseColor("#59FFFFFF"))
            }
            notifyItemChanged(adapterPosition)
            if (selectedList.isEmpty()) {
                isSelectionMode = false
            }
        }

    }

    open inner class BaseViewHolder(view: View) : RecyclerView.ViewHolder(view)


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {

        return if (viewType == selectionViewType) {
            val selectedView
                    : View = LayoutInflater.from(parent.context)
                .inflate(R.layout.container_selection, parent, false)
            SelectionViewHolder(selectedView)
        } else {
            val nonSelectedView
                    : View = LayoutInflater.from(parent.context)
                .inflate(R.layout.container_imageholder, parent, false)
            FolderRViewHolder(nonSelectedView)
        }
    }


    override fun getItemCount(): Int {
        return list.size
    }

    override fun getItemViewType(position: Int): Int {
        return if (isSelectionMode) selectionViewType else nonSelectionViewType
    }

    override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
        if (holder is SelectionViewHolder) {
            val image = list[position]
            holder.itemView.checkbox.isChecked = selectedList.contains(image)

        }
        val factory =
            DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build()

        GlideApp.with(holder.itemView.context).load(list[position].uri)
            .transition(DrawableTransitionOptions.with(factory))
            .override(250, 250).into(holder.itemView.img)
    }

    interface FolderInteractionListener {
        fun onItemClicked(image: Image)
    }

}

I have tried setting the view to long clickable true and returning true to onLongClick method even though I'm not getting on long click method is not triggering

combine viewHolders and their layouts and implement clicks like below:

inner class FolderRViewHolder(
    view: View
) : BaseViewHolder(view), View.OnClickListener, View.OnLongClickListener {
    init {
        view.isLongClickable = true
        view.isClickable = true
        view.setOnClickListener(this)
        view.setOnLongClickListener(this)
    }

    override fun onClick(view: View?) {
        if (isSelectionMode) {
            val string = list[adapterPosition]
            if (selectedList.contains(string)) {
                selectedList.remove(list[adapterPosition])

            } else {
                selectedList.add(list[adapterPosition])
            }
            notifyItemChanged(adapterPosition)
            if (selectedList.isEmpty()) {
                isSelectionMode = false
            }
        } else {
            folderInteractionListener.onItemClicked(list[adapterPosition])
        }
    }

    override fun onLongClick(view: View?): Boolean {
        isSelectionMode = true
        onClick(view)
        return true
    }
}

and:

override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
    holder.itemView.textView.text = list[position]
    val string = list[position]
    if (selectedList.contains(string)){
        holder.itemView.checkbox?.isChecked = false
        holder.itemView.checkbox_container?.setBackgroundColor(0)
    } else {
        view?.checkbox?.isChecked = true
view?.checkbox_container?.setBackgroundColor(Color.parseColor("#59FFFFFF"))
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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