Long Click在recyclerview中不起作用-kotlin

问题描述 投票:0回答:1

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

    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方法也不会触发

android android-recyclerview recycler-adapter
1个回答
0
投票

合并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"))
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.