First start by separating the content description, which describes the element, and the usage hint, which describes how to interact with the element.
If a ViewGroup has no explicit content description, it'll try to infer a description by collating the descriptions of that ViewGroup's children.
You should set an explicit content description for the ViewGroup. I advocate going further and making the children inaccessible directly.
This behaviour means that you have total control, and changes to the layout in future won't include the side effect of the content description for the ViewGroup changing also.
One way to append the selected state is to use a custom ViewGroup:
public class SelectStateDescribingLinearLayout extends LinearLayout {
public SelectStateDescribing(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public CharSequence getContentDescription() {
CharSequence contentDescription = super.getContentDescription();
return isSelected() ? appendSelectedTo(contentDescription) : contentDescription;
}
private String appendSelectedTo(CharSequence contentDescription) {
return getResources().getString(R.string.viewgroup_selected, contentDescription);
}
}
where R.string.viewgroup_selected
is a String resource resolving to: <string name="viewgroup_selected">%1$s selected</string>
For the usage hint ("double tap to select/de-select"), you can use an accessibility delegate. This question has been answered here.