Я пытался сделать то же самое. Я попытался сделать это, используя логику currentChar, упомянутую Каспером. Похоже, что вызовы listView () не всегда находятся в том порядке, в котором вы ожидаете, поэтому это не очень хорошо работает. Мое решение таково:
В XML добавьте TextView с видимостью GONE примерно так. Это будет ваш тег-разделитель.
<TextView
style="?android:attr/listSeparatorTextViewStyle"
android:id="@+id/separator"
android:layout_width="fill_parent"
android:visibility="gone"
android:layout_height="wrap_content"
android:textColor="@android:color/white" />
ПРИМЕЧАНИЕ : я использую стандартный стиль разделителя Android. Конечно, вы можете сделать свой собственный.
Затем добавьте логический массив в свой класс Adapter с помощью метода, подобного этому
/**
* Method takes the alphabetically sorted ArrayList as argument
*/
private void assignSeparatorPositions(ArrayList<Items> items) {
separatorAtIndex = new boolean[items.size()];
char currentChar = 0;
for (int i=0; i< items.size(); i++) {
if ( itemss.get(i).getName().charAt(0) != currentChar ) {
separatorAtIndex[i] = true;
} else {
separatorAtIndex[i] = false;
}
currentChar = items.get(i).getName().charAt(0);
}
}
Наконец, в getView () сделайте что-то вроде этого:
if ( separatorAtIndex[position] ) {
holder.sectionHeader.setText(""+name.charAt(0));
holder.sectionHeader.setVisibility(View.VISIBLE);
} else {
holder.sectionHeader.setVisibility(View.GONE);
}
Этот метод имеет то преимущество, что не требует, чтобы вы отслеживали новые позиции элементов после добавления отдельного представления заголовка.