Имея RecycleView, он имеет несколько элементов, и один из них - это представление, содержащее WebView.Внутри WebView он загружает html, и есть iframe с содержимым html-таблицы, который можно прокручивать по вертикали (содержащийся div имеет фиксированную высоту, меньшую высоты таблицы).
Кажется, есть проблема сRecycler Считайте, что он не передает событие касания в WebView.
Вот что происходит:
При касании экрана для перетаскивания onInterceptTouchEvent () в recycleView сначала return false at ACTION_DOWN
, а затем return true when the event is MotionEvent.ACTION_MOVE
,Это return true
отправит целевому дочернему представлению MotionEvent.Cancel, и все дальнейшие события будут доставлены в onTouchEvent ()
TestDerivedRecycleView:onInterceptTouchEvent(), return: false
event: MotionEvent { action=ACTION_DOWN, actionButton=0... }, this.scrollState: 0
TestDerivedRecycleView:onInterceptTouchEvent(), return: true
event: MotionEvent { action=ACTION_MOVE, actionButton=0... }, this.scrollState: 1
RecycleView. Поэтому я создал производный RecycleView, который, когда событие является ACTION_MOVEна целевом представлении есть WebView, тогда return false to let WebView handle the drag/move
.
Это частично работает.Так как у webView может быть какой-то другой контент, например текстовая область.Если коснуться этой текстовой области, она не будет прокручиваться, поэтому представление рециркуляции не будет прокручиваться.Только если коснуться и перетащить этот элемент таблицы, элемент таблицы будет прокручивать содержимое таблицы.
Желаемое поведение должно происходить при перетаскивании любого элемента в RecyclerView, RecyclerView должен прокручивать его элементы вверх, только при перетаскивании по этой прокручиваемой таблице.элемент, в котором таблица должна прокручивать содержимое, если нижняя часть таблицы не отображается.
Как заставить прокрутку содержимого веб-просмотра работать, когда он является дочерним элементом RecycleView?
class TestDerivedRecycleView : RecyclerView {
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {}
override fun onTouchEvent(event: MotionEvent): Boolean {
val ret = super.onTouchEvent(event)
Log.d("+++", "+++ TestDerivedRecycleView:onTouchEvent(), ret: $ret" +
"\nevent.action: ${event.action}, " +
"\nevent: $event" +
"\nthis: ${this}")
return ret
}
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
val ret = super.onInterceptTouchEvent(event)
val myCell = findChildViewUnder(event.x, event.y)
Log.w("+++", "+++ TestDerivedRecycleView:onInterceptTouchEvent(), ret: $ret" +
"\nmyCell: $myCell"+
"\n event.action: ${event.action}, this.scrollState: ${this.scrollState}" +
"\nevent: $event"+
"\nthis: $this")
// when the event is ACTION_MOVE and is touched on the WebView then return false to let WebView handle the event
if (
(myCell is ArticleWebView) &&
event.action == MotionEvent.ACTION_MOVE
&& this.scrollState == RecyclerView.SCROLL_STATE_DRAGGING
) {
Log.e("+++", "+++ TestDerivedRecycleView:onInterceptTouchEvent(), (myCell is WebView) return false")
return false
}
return ret
}
}