Сортировка списка по алфавиту с разделом по алфавиту с помощью ArrayAdapter в приложении Android - PullRequest
0 голосов
/ 14 декабря 2011

Я хочу получить список с пользовательским adatper, расширяет ArrayAdapter, где Type имеет поле Name (String).Я хочу отсортировать элементы по алфавиту (это не проблема), а затем поместить буквенные разделы.

Например: A Альфа Любой ... C Ребенок ... Я пишу

Также -результаты извлекаются из веб-службы с использованием Paging, поэтому, когда пользователь нажимает кнопку GetMoreResult, список должен обновляться соответствующим образом - будет ли работать notifyDataSetChanged?

Ответы [ 5 ]

8 голосов
/ 28 декабря 2011

Я пытался сделать то же самое. Я попытался сделать это, используя логику 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);
}

Этот метод имеет то преимущество, что не требует, чтобы вы отслеживали новые позиции элементов после добавления отдельного представления заголовка.

3 голосов
/ 14 декабря 2011

Вы можете скачать код для просмотра списка с алфавитами.

http://www.anddev.org/code-snippets-for-android-f33/alphabetical-listview-in-android-t56983.html

2 голосов
/ 14 декабря 2011

Вам нужен разделитель.Используйте это руководство , чтобы выяснить, как добавить разделитель.

Затем в вашем Adapter вам понадобится переменная, которая скажет вам, где вы находитесь в алфавите.

private Char currentChar;

В методе getView вам нужно будет определить, добавляете ли вы обычный Предмет или вы добавляете разделитель.Что-то вроде:

if( currentItem.getCharAt( 0 ) != currentChar )
   //add a seperator.
else
   //add an item.

Следует помнить, что вы можете смешивать индексы элементов, поскольку ListView внезапно будет содержать больше элементов, чем массив.Одним из способов решения этой проблемы является добавление в массив фиктивных элементов (может быть просто нулевым объектом).

1 голос
/ 14 декабря 2011

notifyDataSetChanged обновит список, да.

Только не забывайте не переназначать ваш объект списка при обновлении, поскольку ваш адаптер списка сохраняет ссылку на тот, который вы передали ему при создании.Просто очистите его и заполните его перед вызовом notifyDataSetChanged.

0 голосов
/ 05 августа 2013

Чтобы ответ Саада Фарука работал с CursorAdapter, я использую что-то вроде следующего хака в getView ():

String thisTitle = getStringValue(cursor, TITLE_NAME);
char thisSection = thisTitle.toUpperCase().charAt(0);
holder.sectionHeader.setText(thisSection);

holder.separator.setVisibility(View.GONE);

// Check if the previous entry was a different alphabetic character
if (cursor.moveToPrevious())
{
     String prevTitle = getStringValue(cursor, TITLE_NAME);
     char prevSection = prevTitle.toUpperCase().charAt(0);
     if (prevSection != prevTitle)
     {
        holder.separator.setVisibility(View.VISIBLE);
     }
     cursor.moveToNext();
}

Обратите внимание, что есть лучшие способы показа сегментированного списка, как этот, но этоработает для быстрого взлома при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...