Android ListView可访问性返回索引

Android ListView可访问性返回索引,android,listview,talkback,Android,Listview,Talkback,我在电话上启用了对讲功能 用户向右进行触摸擦拭手势,以选择/高亮显示/等列表中的下一项。我想在列表中有这个新选择的元素的索引 我正在尝试从ListView获取新选定项的索引 listView.setAccessibilityDelegate(new View.AccessibilityDelegate() { @Override public boolean onRequestSendAccessibilityEvent(ViewGroup host, View

我在电话上启用了对讲功能

用户向右进行触摸擦拭手势,以选择/高亮显示/等列表中的下一项。我想在列表中有这个新选择的元素的索引

我正在尝试从ListView获取新选定项的索引

listView.setAccessibilityDelegate(new View.AccessibilityDelegate() {
        @Override
        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {
            if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
                int selectedItemPosition = event.getSelectedItemPosition(); // doesn't work, returns always -1
                  }
        }
});

编辑1
listView.getSelectedItemPosition()
在使用TalkBack选择另一个元素后始终返回-1。

此问题(获取listView所选项目索引的问题)与可访问性API的使用无关,也不应通过使用可访问性API来完成

“getToIndex()”函数的文档:

获取文本选择结束的索引或滚动时最后可见项的索引

从您的说明和您的代码来看,即这一行:

event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) 
您真正要寻找的是刚刚收到焦点的视图,而不是“选中”的视图。这些是非常不同的。我绝对建议改变这个

int selectedItemPosition = ...

这一点要清楚得多。“Selected”在列表视图中的含义非常具体,这让人感到困惑。假设可访问性焦点实际上是您正在寻找的东西,这应该很好:

listView.setAccessibilityDelegate(new View.AccessibilityDelegate() {
    @Override
    public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {

        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
            int accessibilityFocusedItemIndex = -1;

            for (int i = 0; i < host.getChildCount(); i++) {
                if (host.getChildAt(i) == child) {
                    accessibilityFocusedItemIndex = i;
                    break;
                }
            }

            Log.d("LogTag", "Accessibility Focused Item Index: " + accessibilityFocusedItemIndex);
        }

        return super.onRequestSendAccessibilityEvent(host, child, event);
    }
});
listView.setAccessibilityDelegate(新视图.AccessibilityDelegate(){
@凌驾
公共布尔值onRequestSendAccessibilityEvent(视图组主机、视图子级、AccessibilityEvent事件){
if(event.getEventType()==AccessibilityEvent.TYPE\u视图\u可访问性\u焦点){
int accessibilityFocusedItemIndex=-1;
对于(int i=0;i

请注意,列表视图是一种特殊情况,在这种情况下,类似这样的函数可以工作,因为可聚焦子视图通常是宿主视图的直接后代。对于未包装在列表视图单元格中的单个活动元素,这可能不是真的。

很好尝试,但请参见我的编辑,它返回相同的值,即-1…我只是猜测了方法名称…这可能是因为没有选定项,这再次让我回到您的帖子更“有意”的措辞。你想完成什么?因为就我而言,-1可能是你应该期待的,你只是不知道为什么你应该期待它,所以它让你困惑。编辑您的问题,使之成为您试图完成的面向用户的更改,如果您发现“selectedItemPosition”并且该值对您有意义,您将如何处理它。注意:“关注可访问性”和“选定”的视图是完全不同的。您是在寻找刚刚聚焦的视图,还是刚刚选中的视图?请注意,视图在激活之前不会被“选中”,这就是为什么您得到-1。这让我回到。。。用用户体验而不是代码来表达您的问题。因为在这里,您肯定是在非惯用地使用Android代码特定术语。我怀疑您可能想将“selectedItemPosition”更改为“focusedItemPosition”,但这只是一个猜测。尽管再次强调,焦点是一种输入机制。因此,您可能实际上是指“accessibilityFocusedItemPosition”,但即使如此,您为什么会关心这个问题,以及您将如何处理它也不清楚。
listView.setAccessibilityDelegate(new View.AccessibilityDelegate() {
    @Override
    public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {

        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
            int accessibilityFocusedItemIndex = -1;

            for (int i = 0; i < host.getChildCount(); i++) {
                if (host.getChildAt(i) == child) {
                    accessibilityFocusedItemIndex = i;
                    break;
                }
            }

            Log.d("LogTag", "Accessibility Focused Item Index: " + accessibilityFocusedItemIndex);
        }

        return super.onRequestSendAccessibilityEvent(host, child, event);
    }
});