Android如何在阅读列表项计数

时间:2017-04-11 16:57:40

标签: android listview footer talkback

我有一个包含注释列表的对话框,我想让用户滚动到列表的末尾,找到“确定”按钮以关闭对话框。

该对话框包含一个ListView,我使用页脚行将该按钮添加到列表中。

View footerView = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).
                inflate(R.layout.list_footer_button, null, false);
listView.addFooterView(footerView);

当我打开对话并打开此对话框时,它会读取ListView的错误计数,因为它包括页脚行。例如,如果我的列表有3个项目,则对话为“第1项,共4项”。

ISSUE

如何让talkBack读取忽略页脚行的正确项目数?

OR

如果我不能改变这个,我怎么创建一个对话框,用户必须滚动到列表的末尾才能看到按钮以关闭对话框。

2 个答案:

答案 0 :(得分:0)

我已经通过将按钮添加到最后一行的View而不是添加页脚来解决了这个问题。

我的每行布局包含一个textView和一个按钮,按钮设置为“不可见”。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <LinearLayout android:id="@+id/notes_details"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <!-- other views here but removed for this post -->
        <TextView
            android:id="@+id/notes_text"
            style="@style/notes_text_style"/>
    </LinearLayout>

    <Button
        android:id="@+id/notes_button"
        style="@style/notes_button"
        android:layout_below="@id/notes_details"
        android:layout_centerHorizontal="true"
        android:visibility="invisible" />

</RelativeLayout>

在列表的适配器中,我根据行是否是最后一行显示/隐藏按钮

 boolean isLastRow = iPosition == getCount()-1;
 okButton.setVisibility(isLastRow ? View.VISIBLE : View.GONE);

需要更改辅助功能

还有一些额外的工作要使这一切都可用于辅助功能。如果未对支持可访问性进行任何更改,则只能对行进行导航。因此,最后一行将选择备注文本和确定按钮作为一个可选项目,您将无法使用键盘/跟踪球导航到该按钮。

首先,您必须设置列表,以便连续的项目可以聚焦

listView.setItemsCanFocus(true);

其次,在适配器的代码中,我在notes textView和button上设置了focusable / nextFocusXXX

// when in accessibility mode, we want to set the navigation order for
// the list item's text and the OK button
boolean isLastRow = iPosition == getCount()-1;
if (isAccessibilityEnabled) {
    notesTextView.setFocusable(true);
    okButton.setFocusable(true);
    rowView.setNextFocusForwardId(isLastRow ? R.id.notes_button: R.id.notes_text);
    rowView.setNextFocusDownId(isLastRow ? R.id.notes_button: R.id.notes_text);
    okButton.setNextFocusUpId(R.id.notes_text);
}

答案 1 :(得分:0)

我对此问题有另一个用例。

<强>要求

我有一个包含项目列表的屏幕,我在屏幕右下方有一个浮动操作按钮(FAB),允许用户将项目添加到列表中。在每行的右侧是一个按钮,显示该行项的选项。

我需要FAB不覆盖列表中的最后一行,否则我永远无法点击最后一行的右侧按钮,因为它将位于FAB下方。

解决方案及其问题

我尝试了几种解决方案。一个是在列表项中添加一个额外的计数,当获取最后一行的视图时,我返回一个空视图,即FAB的高度。我还尝试将此空填充行添加为列表页脚。在这两种情况下,TalkBack都会为列表中的项目数量读取太多。

我无法使用我针对此问题发布的解决方案作为我的笔记列表。我需要FAB始终位于屏幕的右下角(不仅仅是在最后一行之后),即使列表中只有1个或2个项目,也不是屏幕上的项目。

工作解决方案

将下面代码中的最后4个属性添加到xml布局中的列表定义中似乎解决了这个问题。没有其他项目添加到列表中,因此TalkBack正确读取列表计数,以下内容确保屏幕左下方的FAB永远不会与最后一行重叠。

<!-- Instead of adding a footer row to stay clear of the FAB,
     add a padding to the listView and set clipToPadding to false
     android:overScrollFooter is set to transparent to avoid having a divider
     for the last item  so there is just white space below the last item -->

<ListView
    style="@style/my_list_style"
    android:layout_alignParentTop="true"

    android:paddingBottom="82dp"
    android:clipToPadding="false"
    android:footerDividersEnabled="false"
    android:overScrollFooter="@android:color/transparent"/>