繁体   English   中英

Long Click 在 recyclerview 中不起作用 - kotlin

[英]Long Click is not working in recyclerview - kotlin

我需要在长按项目时启用选择模式,并在选择列表为空时禁用它。 单击时工作正常,但长按无法正常工作

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

}

我已经尝试将视图设置为 long clickable true 并返回 true 到 onLongClick 方法,即使我没有进入 long click 方法没有触发

结合 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
    }
}

和:

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