取消选择 RecyclerView 单元格,但点击它之外的任何地方

Posted

技术标签:

【中文标题】取消选择 RecyclerView 单元格,但点击它之外的任何地方【英文标题】:Deselect RecyclerView cell but tapping anywhere outside of it 【发布时间】:2021-06-01 10:16:03 【问题描述】:

我有一个线性布局,其中包含三个水平滚动的 recylerview。当用户在其中一个回收器视图中点击一个单元格时,它被“突出显示”并处于选定状态。当用户点击它之外的任何地方时,我需要取消选择此单元格。

我尝试将 onClickListener 添加到父 LinearLayout 视图,但不是每次都被点击。我还尝试在回收站视图上添加一个视图,其中 Framelayout 作为 LinearLayout 和 View 的父布局,但这阻止了用户滚动视图。

我也尝试过使用android:descendantFocusability,但如果可行的话,我无法让它工作。

任何建议将不胜感激。

XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/parent_timeline_layout"
android:layout_
android:layout_
android:gravity="center"
android:orientation="vertical">

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view_1"
    ....
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view_2"
    ....
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view_3"
    ....
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</LinearLayout>

【问题讨论】:

【参考方案1】:

我想出的解决方案是将 onTouchListeners 添加到每个 recyclerView 以及基础 rootView。然后我为每个人实现了SimpleOnGestureListener,以了解何时触发了一次点击,而不仅仅是任何触摸。这意味着滚动正常执行!

CustomGestureClass:

internal class RecyclerViewGesture : SimpleOnGestureListener() 
    override fun onDown(e: MotionEvent): Boolean 
        return true
    

    override fun onSingleTapConfirmed(e: MotionEvent): Boolean 
        unselectAllCells.postValue(true)
        return false
    

然后在片段中我创建了一个类的实例

recyclerViewDetector = GestureDetectorCompat(context!!, RecyclerViewGesture())

然后我使用了onTouchListener 然后返回了手势

  myRecyclerView.setOnTouchListener  p0, event ->
            recyclerViewDetector!!.onTouchEvent(event)
        

我为每个回收站视图创建了三个,然后为根视图使用了 onclickListener。我使用 MutableLiveData 值发布到任何 Gestures/OnClick 击中并取消选择观察者中的所有单元格时

     unselectAllCells.observe(this, Observer 
        if(unselectAllCells.value!!)
            unselectAnyGraphicalImageCell()
        
    )

希望有一天这可以为某人减轻痛苦!

【讨论】:

以上是关于取消选择 RecyclerView 单元格,但点击它之外的任何地方的主要内容,如果未能解决你的问题,请参考以下文章

在第二次点击时取消选择 UICollectionView 单元格

当点击另一个按钮时,取消选择表格视图单元格中的按钮

弹出详细视图后自动取消选择表视图单元格?

如何取消表格单元格选择

如何在单元格选择/取消选择时正确切换 UITableViewCell 的 accesoryType?

取消选择当前不可见的单元格