Dodajmy składniki – showIngredientPickerDialog – #16

Wymyśliłam sobie, że przy dodawaniu składników do posiłku, te składniki, które już są przypisane do danego posiłku mają mieć domyślnie zaznaczonego checkboxa… to sobie wymyśliłam…

Na początek potrzebowałam stworzyć zapytanie sql… szkoda, że pomimo wielu prób nie udało mi się skopiować bazy danych z telefonu i otworzyć jej w jakimś managerze bazy danych. Dobrze, że mam prostą strukturę, którą mogłam odtworzyć w SQLFiddle. Na ten moment query wygląda tak:

select ingredient._id, ingredient.name,
CASE WHEN EXISTS(
SELECT 1 from ingredient as ingredient2
join meal_ingredient on ingredient2._id= meal_ingredient.ingredient_id
join meal on meal._id= meal_ingredient.meal_id
where ingredient2._id = ingredient._id and meal._id = ?
) THEN 1
ELSE 0
END as checked
from ingredient

view raw
ingredients.sql
hosted with ❤ by GitHub

W niedalekiej przyszłości planuję stworzyć jakiś sql builder, bo nie chcę przechowywać aż tak zahardkodowanej struktury, a zwykła podmiana nazw tabelek na zmiennie wygląda tragicznie…

Żeby móc dobrać się do checkboxów na liście musiałam stworzyć własny xml zawierający rekord z listView:

<android.support.percent.PercentRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<TextView
android:id="@+id/text1"
app:layout_widthPercent="90%"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
/>
<CheckBox
android:id="@+id/checkBox"
app:layout_widthPercent="10%"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/text1" />
</android.support.percent.PercentRelativeLayout>

view raw
multicheck_list.xml
hosted with ❤ by GitHub

Potrzebowałam ułożyć obok siebie dwa komponenty i jednocześnie miało być to użyte w dwóch widokach różniących się szerokością, więc użyłam PercentRelativeLayout. Dzięki temu ładnie się dopasowuje niezależnie od szerokości komponentu. Żeby użyć tego layoutu do build.gradle trzeba dorzucić dodatkową linijkę:

compile 'com.android.support:percent:25.3.1'

view raw
build.gradle
hosted with ❤ by GitHub

Poza stworzeniem xml-a musiałam jeszcze podpiąć listenery. Tu pojawiły się dwa problemy. XML-a ładowałam w adapterze, to też było jedyne miejsce gdzie mogłam podpiąć zdarzenia na onClick, a jednocześnie potrzebowałam dwóch różnych reakcji w zależności od widoku, który wyzwolił akcję. Na szczęście wszystko udało się rozwiązać. W adapterze ustawiłam taką obsługę zdarzeń:

private View.OnClickListener getOnClickListener(final int position, @NonNull final ListView parent) {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
parent.performItemClick(v, position, filteredData[position].getId());
}
};
}

Takie podejście pozwala przekazać zdarzenie do elementu nadrzędnego – w moim przypadku do listView i oprogramować je dla każdego widoku osobno 🙂

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ingredientListAdapter.getItem(position).setChecked(!ingredientListAdapter.getItem(position).isChecked());
ingredientListAdapter.notifyDataSetChanged();
}
});

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.getItem(position).setChecked(!adapter.getItem(position).isChecked());
adapter.notifyDataSetChanged();
deleteButton.setVisibility(adapter.isAnyItemSelected()? View.VISIBLE : View.INVISIBLE);
}
});

Małe niewyraźne demo jak to wygląda teraz:

output_yKyWpj.gif

 

Dodaj komentarz

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: