Отмените выделение ячейки RecyclerView, но коснитесь любого места за ее пределами

#android #xml #android-recyclerview

#Android #xml #android-recyclerview

Вопрос:

У меня есть линейный макет с тремя повторными просмотрами, которые все прокручиваются по горизонтали. Когда пользователь нажимает на ячейку в одном из представлений recycler, она «выделяется» и находится в выбранном состоянии. Мне нужно отменить выбор этой ячейки, когда пользователь нажимает в любом месте за ее пределами.

Я попытался добавить OnClickListener в родительское представление LinearLayout, но оно не отображается каждый раз. Я также попытался добавить представление поверх представлений recycler с 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_width="match_parent"
android:layout_height="match_parent"
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 к каждому из RecyclerViews, а также к базовому 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)
        }
 

Я создал три из них для каждого из представлений recycler, а затем использовал OnClickListener для корневого представления. Я использовал значение MutableLiveData для публикации, когда любой из жестов / OnClick where нажимал и отменял выбор всех ячеек в наблюдателе

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

Надеюсь, это когда-нибудь избавит кого-нибудь от боли!