Проблема в том, что вы используете keyAt
, который, согласно документации API
, возвращает ключ из сопоставления ключ-значение indexth, которое хранит этот SparseBooleanArray.
и этот SparseBooleanArray
содержит только отмеченные элементы вашего списка (getCheckedItemPositions
)!
Так что, если вы отметите два элемента из трех, тогда элемент CheCked
будет содержать два элемента, и когдаВы вызываете keyAt(2)
, он вернет 0 (не IndexOutOfBoundsException
, хотя в этой позиции карта не содержит значения).
Вы должны просто использовать метод get
этого SparseBooleanArray
, с позициями элементов из вашего ListView
в качестве аргументов:
builder.setPositiveButton("Okay", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
SparseBooleanArray CheCked = ((AlertDialog) dialog).getListView().getCheckedItemPositions();
if (CheCked.get(0))
{
Toast.makeText(TmpActivity2.this, "Item 1", Toast.LENGTH_SHORT).show();
}
if (CheCked.get(1))
{
Toast.makeText(TmpActivity2.this, "Item 2", Toast.LENGTH_SHORT).show();
}
if (CheCked.get(2))
{
Toast.makeText(TmpActivity2.this, "Item 3", Toast.LENGTH_SHORT).show();
}
}
});
Вы также можете потерять == true
часть предложения if
, но это только семантика.
Если вы посмотрите на документацию API метода getCheckedItemPositions
, вы найдете следующее решение:
Возвращает :SparseBooleanArray
, который будет возвращать true для каждого вызова get(int position)
, где position
- позиция в списке, или null
, если режим выбора установлен на CHOICE_MODE_NONE
.