【筆記】Android RecyclerView在PopupWindow中複用的item點擊事件需要兩次點擊才響應的問題

開發的過程中遇到了如標題所述的問題 具體的圖如下所示

在PopupWindow的佈局中定義的recyclerview 點擊之後item會變色 但是一開始在adapter中是這麼寫的:

holder.mItemView.setOnClickListener {
    isSelected = !isSelected
    mDataList[position].isSelected = isSelected
    holder.mItemView.isSelected = isSelected
    Log.e("PopupMultiItemAdapter", "position = $position isSelected = $isSelected mItemView.isSelected = ${holder.mItemView.isSelected}")
    holder.mTextView.setTextColor(
        if (isSelected) Color.WHITE
        else holder.mItemView.context.resources.getColor(R.color.alphaColorCyan)
    )
}

但是發現 點擊之後將點擊後的item滑出屏幕 再滑回來點擊時 需要點擊兩次才能走進這個點擊代碼的邏輯 即便打斷點調試 也沒找到問題所在。於是我就換了思路想 看看setOnTouchListener這個方法 畢竟觸摸事件還是優先分發的 當我在這個方法裏打日誌後 發現:

果然會觸發兩次(只DOWN和UP) 所以可以在這裏做一下處理:

holder.mItemView.setOnTouchListener { v, event ->
    Log.e("PopupMultiItemAdapter", "onTouch")
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {
            return@setOnTouchListener true
        }
        MotionEvent.ACTION_UP -> {
            isSelected = !isSelected
            mDataList[position].isSelected = isSelected
            holder.mItemView.isSelected = isSelected
            Log.e("PopupMultiItemAdapter", "position = $position isSelected = $isSelected mItemView.isSelected = ${holder.mItemView.isSelected}")
            holder.mTextView.setTextColor(
                if (isSelected) Color.WHITE
                else holder.mItemView.context.resources.getColor(R.color.alphaColorCyan)
            )
            return@setOnTouchListener true
        }
        else -> {
            return@setOnTouchListener false
        }
    }
}

這樣就可以解決問題了~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章