[英]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.