protected void setupMultiChoiceDialog(AlertDialog.Builder builder) {
    final List<ItemT> availableItems = getAvailableItems();

    final ItemPrinter<ItemT> ip = getItemPrinter();
    CharSequence[] items = new CharSequence[availableItems.size()];
    boolean[] checked = new boolean[availableItems.size()];
    for (int i = 0; i < availableItems.size(); ++i) {
      items[i] = ip.itemToString(getItemAt(i));
      if (selectedItems.get(i) != null) {
        checked[i] = true;
      } else {
        checked[i] = false;
      }
    }

    builder.setMultiChoiceItems(
        items,
        checked,
        new DialogInterface.OnMultiChoiceClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which, boolean isChecked) {
            if (isChecked) selectedItems.put(which, getItemAt(which));
            else selectedItems.delete(which);
          }
        });
  }
  protected void setupSingleChoiceDialog(AlertDialog.Builder builder) {
    final List<ItemT> availableItems = getAvailableItems();

    final ItemPrinter<ItemT> ip = getItemPrinter();
    CharSequence[] items = new CharSequence[availableItems.size()];
    for (int i = 0; i < availableItems.size(); ++i) {
      items[i] = ip.itemToString(availableItems.get(i));
    }

    int checked = -1;
    if (selectedItems.size() > 0) {
      checked = selectedItems.keyAt(0);
      selectedItems.put(checked, getItemAt(checked));
    }

    builder.setSingleChoiceItems(
        items,
        checked,
        new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            selectedItems.clear();
            selectedItems.put(which, getItemAt(which));
          }
        });
  }