简体   繁体   English

Long Click 在 recyclerview 中不起作用 - kotlin

[英]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我已经尝试将视图设置为 long clickable true 并返回 true 到 onLongClick 方法,即使我没有进入 long click 方法没有触发

combine viewHolders and their layouts and implement clicks like below:结合 viewHolders 和它们的布局并实现如下点击:

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"))
    }
}

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

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