2012-10-04 8 views
4

Выяснить, как разделять список, пинает мою задницу прямо сейчас. Я видел код для sectioned-list-adapter здесь: ListView with scrolling/fixed header rows, и это может быть в конечном итоге то, что я хочу, но, возможно, есть лучший способ.Динамически создайте listview с заголовками строк за каждый месяц

Вот требования, которые мне нужны:

  • данных для ListView должен поступать из базы данных SQLite (см ниже код для сервировки стола)
  • Данные должны быть сгруппированы по месяцам (бонусные баллы за месяц/год)
  • строка заголовка должна содержать количество элементов, записанных в базе данных для этого месяца
  • должен быть совместимы с API 8+
  • должен быть в состоянии щелкнуть элемент, чтобы открыть диск OG, содержащий шаги, выполняемые в тот же день (я уже знаю, как это сделать, когда я могу получить список созданных)

Глядя на seperatedListAdapter Джеффа Snarkey здесь: http://jsharkey.org/blog/2008/08/18/separating-lists-with-headers-in-android-09/ я смог придумать следующее:

datasource = new SmashDataSource(this); 
    datasource.open(); 
    BJJHistory = (ListView) findViewById(R.id.ListHistory); 

    // create our list and custom adapter 
    adapter = new SeparatedListAdapter(this); 
    HistoryBJJ = datasource.getBJJHistory(); 
    // THE DESIRED COLUMNS TO BE BOUND 
    final String[] columns = new String[] { SQLiteHelper.DATE }; 

    // THE XML DEFINED VIEWS WHICH THE DATA WILL BE BOUND TO 
    final int[] to = new int[] { R.id.list_item_title }; 
    if (HistoryBJJ != null) { 
     adapter.addSection("October", new SimpleCursorAdapter(this, R.layout.list_item, 
       HistoryBJJ, columns, to)); 
    } 

    BJJHistory.setAdapter(adapter); 

при этом используется следующий курсор, чтобы вытащить данные из базы данных SQLite в порядке убывания:

public Cursor getBJJHistory() { 
    final String[] columns = { SQLiteHelper.COLUMN_ID, SQLiteHelper.DATE }; 
    final Cursor History; 
    History = database.query(SQLiteHelper.TABLE_BJJ, columns, null, null, null, null, 
      SQLiteHelper.DATE + " DESC"); 
    return History; 

} 

Это приводит к следующему:

sample list

Это хорошо для начала, но представляет меня две проблемы:

  • Как динамически населяют значение «Заголовок» с месяца? Я подумал об использовании курсора для заполнения массива со списком месяцев (после форматирования их с помощью SimpleDateFormat), затем выполнив цикл For Each, чтобы пройти через каждый, передав месяц назад методу курсора, чтобы вытащить все записи с значением даты и времени в этом месяце.
  • Как отобразить результаты в строке как количество записей за этот день? В идеале хотелось бы что-то вроде этого: daterow

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

Для первого, возвращаясь к примеру код здесь: http://code.google.com/p/android-section-list/ вместо примера массива при условии, я думаю, я мог бы изменить следующим образом:

SectionListItem[] exampleArray = { // Comment to prevent re-format 
new SectionListItem("Test 1 - A", "A"), // 
     new SectionListItem("Test 2 - A", "A"), // 
     new SectionListItem("Test 3 - A", "A"), // 
     new SectionListItem("Test 4 - A", "A"), // 
     new SectionListItem("Test 5 - A", "A"), // 
     new SectionListItem("Test 6 - B", "B"), // 
     new SectionListItem("Test 7 - B", "B"), // 
     new SectionListItem("Test 8 - B", "B"), // 
     new SectionListItem("Test 9 - Long", "Long section"), // 
     new SectionListItem("Test 10 - Long", "Long section"), // 
     new SectionListItem("Test 11 - Long", "Long section"), // 
     new SectionListItem("Test 12 - Long", "Long section"), // 
     new SectionListItem("Test 13 - Long", "Long section"), // 
     new SectionListItem("Test 14 - A again", "A"), // 
     new SectionListItem("Test 15 - A again", "A"), // 
     new SectionListItem("Test 16 - A again", "A"), // 
     new SectionListItem("Test 17 - B again", "B"), // 
     new SectionListItem("Test 18 - B again", "B"), // 
     new SectionListItem("Test 19 - B again", "B"), // 
     new SectionListItem("Test 20 - B again", "B"), // 
     new SectionListItem("Test 21 - B again", "B"), // 
     new SectionListItem("Test 22 - B again", "B"), // 
     new SectionListItem("Test 23 - C", "C"), // 
     new SectionListItem("Test 24 - C", "C"), // 
     new SectionListItem("Test 25 - C", "C"), // 
     new SectionListItem("Test 26 - C", "C"), // 

и заменить, что с курсорами или что не необходимо было извлекать данные за днем, а вместо «А», «В», «С» заменить это на имя месяца.

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

Как ссылка, это скриншот «CardioTrainer», приложение для тренировки, которое имеет пользовательский раздел, но в основном я пытаюсь дублировать, по крайней мере, в функции.

cardio trainer screenshot

В таблице это исходит из выглядит следующим образом: datatable

+1

Прежде всего, я рекомендую не использовать чужой адаптер, если вам нужно настроить заголовки разделов. Не очень сложно реализовать разделы в списке. Мне просто нужно одно. Когда вы извлекаете курсор в базу данных для отображения, вы тянете все данные по порядку относительно времени? Что вы делаете, когда происходят изменения в этом году? Например, вы показываете разделы с июня по декабрь 2011 года, то что должно произойти, когда наступает дата с января 2012 года? –

ответ

1

Как об использовании https://github.com/commonsguy/cwac-merge вместо http://code.google.com/p/android-section-list/.

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

Во-вторых, использование слияния адаптера является простым.

addView (Ваш Разрез) addAdapter (Ваш конкретный раздел адаптер)

Это должно получить ты :)

Надеется, что это помогает.

Смежные вопросы