wejściowy ekran – BaseExpandableListAdapter – #11

Czyżby to już był półmetek DSP? Bo ja dopiero wejściowy ekran zakodowałam 😉

No może gdybym lepiej to obmyśliła, to nie musiałabym przez kilka tygodni trzymać na głównym ekranie czegoś co było jednym, wielkim mockiem. Ale już jest i działa.

wp-1491982880600.

Myślałam na początku, że zrobienie kolejnego adaptera to będzie takie bardziej kopiuj-wklej z poprzedniego, ale ostatecznie doszłam do wniosku, że nie ma co powielać rozwiązań skoro chciałabym z tego projektu wyciągnąć jak najwięcej i udało mi się stworzyć listę, która ładnie grupuje nam dania po dacie. Z tym ładnie, to się jeszcze zastanawiam, bo kod, który grupuje mi się nie podoba (to nie Java 8, żeby zrobić to lambdą):


private TreeMap<Date, List<Dinner>> getPreparedHashMap(Dinner[] dinners) {
TreeMap<Date, List<Dinner>> preparedRows = new TreeMap<>();
Calendar calendarInstance = Calendar.getInstance();
calendarInstance.setTime(TimeUtils.getSaturdayDate(new Date()));
for (int i = 0; i < TimeUtils.DAYS_IN_PLANNER; i++) {
Date date = calendarInstance.getTime();
List<Dinner> dinnersList = new ArrayList<>();
for (Dinner dinner : dinners) {
if (dinner.getDate().getTime() == date.getTime()) {
dinnersList.add(dinner);
}
}
preparedRows.put(date, dinnersList);
calendarInstance.roll(Calendar.DATE, true);
}
return preparedRows;
}

Wybrałam użycie TreeMap zamiast zwykłego HashMap, bo zależało mi na tym, żeby mieć posortowane klucze. Tracę na szybkości obsługi, ale priorytetem było to żeby daty były po kolei.

Cały koda adaptera na gicie.

Lista poza rozwijaniem poziomów obsługuje jeszcze przytrzymanie na nazwie grupy (pokazuje okienko dodawania z ustawioną datą – wziętą z grupy).


expandableListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
int itemType = ExpandableListView.getPackedPositionType(id);
if (itemType == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
long packedPos = ((ExpandableListView) parent).getExpandableListPosition(position);
int groupPosition = ExpandableListView.getPackedPositionGroup(packedPos);
Date date = dinnerAdapter.getGroup(groupPosition);
final AlertDialog.Builder builder = addNewDinnerBuilder(view, date);
builder.show();
return true;
}
return false;
}
});

Ta funkcja sprawiła, że musiałam trochę pogoogle’ać, bo jeśli jakieś elementy w liście były rozwinięte, to position nie pokazywało już pozycji grupy, tylko bardziej jej pozycję względem wszystkich widocznych (rozwiniętych) elementów na liście. Co przy przytrzymaniu ostatniego elementu na liście wyrzucało wyjątek, bo próbowałam się dostać do elementu spoza listy, ale nie ma takiego błędu, którego by stack overflow nie rozwiązał 😉

wp-1491994359671.

Z kolei kliknięcie na rozwiniętym dziecku pokazuje menu z opcją dodania kolejnego posiłku, usunięciem klikniętego i zmianą daty.

wp-1491994377308.


expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, final View v, final int groupPosition, final int childPosition, final long id) {
AlertDialog.Builder childContextMenuBuilder = new AlertDialog.Builder(v.getContext());
childContextMenuBuilder.setItems(R.array.dinner_child_actions, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Date date = dinnerAdapter.getGroup(groupPosition);
switch (which) {
case 0:
AlertDialog.Builder addBuilder = addNewDinnerBuilder(v, date);
addBuilder.show();
break;
case 1:
dinnerContract.deleteDinner(id, dbHelper);
dinnerAdapter.updateResults(dinnerContract.getDinners(dbHelper));
break;
case 2:
Dinner dinner = dinnerAdapter.getChild(groupPosition, childPosition);
AlertDialog.Builder editBuilder = addNewDinnerBuilder(v, date, dinner);
editBuilder.show();
break;
}
}
});
childContextMenuBuilder.show();
return true;
}
});

Tutaj ciekawostką jest użycie zamiast deklaracji tablicy Stringów – resources

R.array.dinner_child_actions

deklaracja tej listy to xml ukryty w folderze res/values/arrays.xml


<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="dinner_child_actions">
<item>Dodaj</item>
<item>Usuń</item>
<item>Zmień datę</item>
</string-array>
</resources>

view raw

arrays.xml

hosted with ❤ by GitHub

Pozostaje pytanie co dalej? mam dwie opcje: mogę wziąć się za kolejną tabelkę (składniki) albo mogę ogarnąć ustawienia użytkownika, żeby wyświetlanie spisu na 7 dni i soboty jako pierwszego dnia nie było zahardkodowane. Ta druga opcja kusi, bo to coś zupełnie nowego. Zobaczymy 🙂

2 uwagi do wpisu “wejściowy ekran – BaseExpandableListAdapter – #11

Skomentuj

Proszę zalogować się jedną z tych metod aby dodawać swoje komentarze:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google

Komentujesz korzystając z konta Google. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s

Ta witryna wykorzystuje usługę Akismet aby zredukować ilość spamu. Dowiedz się w jaki sposób dane w twoich komentarzach są przetwarzane.