According to Android documentation (link given in comment of @MarcoAcierno) you need the symbol Z five times to parse the timezone offset. Note that in Java-6 there is no built-in solution for handling the colon in offset part, but Java-7 has introduced the new symbol X (here three times: XXX). Another example for (Android != Java). So the final pattern looks like:
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ");
java.util.Date d = sdf.parse("2014-04-23T14:20:00.000-07:00");
Specifying a Locale is not necessary because your format does not contain any language- or locale-sensitive parts (is just pure ISO-format).