#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()
}
})
Надеюсь, это когда-нибудь избавит кого-нибудь от боли!