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;
}
});

view raw
MainActivity.java
hosted with ❤ by GitHub

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;
}
});

view raw
MainActivity.java
hosted with ❤ by GitHub

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 🙂

0 thoughts on “wejściowy ekran – BaseExpandableListAdapter – #11

Skomentuj paulinakaczmarek Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

%d bloggers like this: