簡體   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