我需要在长按该项目时启用选择模式,而在选择列表为空时禁用它。单击正常,但长按无法正常工作
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"))
}
}