Recyclerview 中的 Android 辅助功能语音助手问题

Sub*_*aik 5 accessibility samsung-mobile talkback android-recyclerview

我已在 Note 5 中打开语音助手,并尝试向前移动(从上到下),但当它到达屏幕末尾时,它就会退出 Recyclerview。由于列表中有更多项目,因此它应该自动向上滚动。

我在Samsung Note 5 和 Samsung Note 9中观察到此问题,但在Samsung 9 和 Samsung 9+中运行良好。

我在 RecyclerView 的每一项中都保持了 focusable true 。我已经使用了一种解决方案,但我认为这不是最好的解决方案,任何人都可以建议我什么是最好的方法。

我的解决方案:我通过检测时刻来手动滚动列表。

回收视图

<RecyclerView>.setAccessibilityDelegateCompat(RVAccessibilityDelegate(<RecyclerView>, <No of item you want to scroll>))

RVAccessibilityDelegate

   RecyclerViewAccessibilityDelegate(recyclerView){

   private var previousItemPosition = 0

   override fun onRequestSendAccessibilityEvent(host: ViewGroup, child: View, event: AccessibilityEvent): Boolean {

       if (event.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {


           if (host is RecyclerView) {

               var childPosition = host.getChildAdapterPosition(child)

               if (childPosition == 0 && previousItemPosition == 0) {

                   host.smoothScrollToPosition(1)

               } else if (previousItemPosition < childPosition) {

                   host.smoothScrollToPosition(childPosition + scrollItem)
                   previousItemPosition = childPosition

               } else if (previousItemPosition > childPosition) {

                   var scrollUpto = childPosition - scrollItem
                   if (scrollUpto < 0) {
                       scrollUpto = 0
                   }
                   if (childPosition == 0) {
                       host.smoothScrollToPosition(childPosition)
                   } else {
                       host.smoothScrollToPosition(scrollUpto)
                   }
                   previousItemPosition = childPosition
               }
           }

           return true
       }
       return super.onRequestSendAccessibilityEvent(host, child, event)
   }
}```





Run Code Online (Sandbox Code Playgroud)

Ant*_*aev 0

代码的简化版本:

recyclerView.setAccessibilityDelegateCompat(object : RecyclerViewAccessibilityDelegate(recyclerView) {

    private var previousItemPosition = 0

    override fun onRequestSendAccessibilityEvent(host: ViewGroup, child: View, event: AccessibilityEvent): Boolean {
        if (event.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
            if (host is RecyclerView) {
                val childPosition = host.getChildAdapterPosition(child)
                if (previousItemPosition < childPosition) {
                    host.smoothScrollToPosition(childPosition + 1)
                } else if (previousItemPosition > childPosition) {
                    host.smoothScrollToPosition(Math.max(0, childPosition - 1))
                }
                previousItemPosition = childPosition
            }
            return true
        }
        return super.onRequestSendAccessibilityEvent(host, child, event)
    }
})
Run Code Online (Sandbox Code Playgroud)