Czas na listę zakupów – #1C

Podgląd listy zakupów wygenerowany. Kolejny krok naprzód na drodze do zakończenia podstawowej wersji aplikacji 😉

wp-1494576697071.

A zatem po kolei 🙂

Główne menu wzbogaciło się o ikonkę:


<item
android:id="@+id/shopping_list_item"
android:icon="@drawable/checklist_icon"
android:title="@string/shopping_list"
app:showAsAction="ifRoom" />

view raw

main_menu.xml

hosted with ❤ by GitHub

Jak dodać własną ikonkę? Menu_023

Dla plików png wybieramy Image Asset, dla SVG, PSD wybieramy Vector Asset.

Asset Studio_024

To wygeneruje wszystkie potrzebne ikonki i wstawi je do odpowiedniego folderu źródłowego.

Po kliknięciu w przycisk wywołuję metodę, która z listy obiadów na ten tydzień wyłuskuje mi posiłki:


private void showShoppingListDialog() {
MealIngredientContract mealIngredientContract = new MealIngredientContract();
Dinner[] dinners = dinnerContract.getDinners(dbHelper);
List<Meal> meals = new ArrayList<>();
for (Dinner dinner : dinners) {
Meal meal = dinner.getMeal();
meals.add(meal);
}
AlertDialog d = new AlertDialog.Builder(this)
.setTitle(R.string.shopping_list)
.setPositiveButton(android.R.string.ok, null)
.setMessage(mealIngredientContract.getShoppingList(meals, dbHelper))
.create();
d.show();
}

Posiłki przekazuję do metody z mealIngredientContract, żeby skorzystać z tego, że mam tam już query, którego, po drobnych modyfikacjach, mogę użyć ponownie. Najpierw budowa query:


@NonNull
private String getShoppingListQuery(List<Meal> meals) {
StringBuffer sb = new StringBuffer();
sb.append("select name, count(name) from (");
for (int i = 0; i < meals.size(); i++) {
sb.append(getIngredientsQuery());
if (i < meals.size() – 1) {
sb.append(" union all ");
}
}
sb.append(") group by name order by name collate nocase;");
return sb.toString();
}

Dla każdej potrawy pobieram zapytanie zwracające listę składników i łączę wyniki w jedno za pomocą ” union all”. Tak połączone zapytanie opakowuję w selecta, którym grupuje wszystkie składniki i zliczam ile razy pojawiły się na liście.

Pozostaje tylko przekazanie zapytania do bazy danych i przekazanie wyniku na zewnątrz funkcji.


public String getShoppingList(List<Meal> meals, SQLiteOpenHelper helper) {
ArrayList<String> array_list = new ArrayList<>();
String[] queryArgs = getMealIds(meals);
String query = getShoppingListQuery(meals);
SQLiteDatabase db = helper.getReadableDatabase();
Cursor res = db.rawQuery(query, queryArgs);
if (res != null && res.getCount() > 0) {
res.moveToFirst();
do {
String name = res.getString(0);
int count = res.getInt(1);
array_list.add(count + " x " + name + "\n");
} while (res.moveToNext());
}
db.close();
return TextUtils.join("\n", array_list);
}

Jak na razie jako zwykły string, ale kto wie do czego dojdę w kolejnych krokach 😉

Brakuje jeszcze jednej metody do domknięcia tematu.


@NonNull
private String[] getMealIds(List<Meal> meals) {
String[] stringArgs = new String[meals.size()];
for (int i = 0; i < meals.size(); i++) {
stringArgs[i] = Long.toString(meals.get(i).getId());
}
return stringArgs;
}

Planuję dać użytkownikowi możliwość otworzenia tej listy poza okienkiem alertu i umożliwić mu odznaczanie elementów z listy.

Eh, kolejne plany, a koniec konkursu już niebawem 🙂

Dodaj komentarz

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.