Lista posiłków – taki mały, wielki komponent:
Pozwala dodać element do tabelki w bazie danych, wyświetla to co w tabelce (o, bug w sortowaniu 😛 ), pozwala edytować i usunąć to co zapisane. To czego nie widać akurat na tym ekranie to możliwość filtrowania [w sumie, może tutaj też by się przydało]. Pojawia się to w innym miejscu aplikacji, bo tego samego adaptera używam też w innym miejscu zgodnie z zasadą DRY
Cały kod adaptera do znalezienia na githubie (dokładnie tu). Ogólnie zaczął być tworzony jako klasa rozszerzająca BaseAdapter do czasu kiedy okazało się, że przydałoby się jednak zrobić to tak, żeby można go było użyć ponownie przy ekranie z wyborem posiłków. Największym wyzwaniem okazało się, sprawienie żeby działał raz na widoku, który obsługuje wybranie jednego elementu z listy, a za drugim razem dla wielokrotnego wyboru. Rozwiązaniem tego problemu okazał się być ArrayAdapter, który pozwolił mi zdefiniować z jakich dokładnie obiektów składa się moja lista i jakiego komponentu użyć do jej wyświetlenia. Adapter implementuje też interface gFilterable, znaczy się, implementuję metodę getFilter, która filtruje posiłki na podstawie tego co użytkownik wpisał w pole do wyszukiwania. Brzmi to poważniej niż sam kod 😀
Tworzenie adaptera, w jednym (MealListActivity.java)
adapter = new MealListAdapter(this, android.R.layout.simple_list_item_multiple_choice, mealContract.getAllMealsArray(dbHelper));
i w drugim przypadku (MealPickerFragment.java)
final MealListAdapter adapter = new MealListAdapter(getContext(), android.R.layout.simple_list_item_1, meals);
Po stworzeniu podłączenie
mealListView.setAdapter(adapter);
ListView nie byłby kompletny bez zaimplementowania kilku akcji – onItemClick żeby zaznaczyć do usunięcia i onItemLongClick do edycji dla ekranu do zarządzaniem posiłkami:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { | |
@Override | |
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | |
Button deleteMealButton = (Button) findViewById(R.id.delete_meal_button); | |
if (listView.getCheckedItemCount() == 0) { | |
deleteMealButton.setVisibility(View.INVISIBLE); | |
} else { | |
deleteMealButton.setVisibility(View.VISIBLE); | |
} | |
} | |
}); | |
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { | |
@Override | |
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { | |
Meal meal = adapter.getItem(position); | |
final AlertDialog.Builder builder = getAlertBuilder(view, mealContract, meal); | |
builder.show(); | |
return true; | |
} | |
}); |
Wybieranie i wykonywanie filtrowania na liście/adapterze w miejscu gdzie tworzymy obiad:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mealListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { | |
@Override | |
public void onItemClick(AdapterView<?> parent, View dialogView, int position, long id) { | |
TextView mealName = (TextView) getActivity().findViewById(R.id.meal_name_text); | |
mealName.setText(adapter.getItem(position).getName()); | |
TextView mealId = (TextView) getActivity().findViewById(R.id.meal_name_id); | |
mealId.setText(String.valueOf(adapter.getItem(position).getId())); | |
MealPickerFragment.this.dismiss(); | |
} | |
}); | |
EditText filterEditText = (EditText) view.findViewById(R.id.meal_name_filter); | |
filterEditText.addTextChangedListener(new TextWatcher() { | |
@Override | |
public void beforeTextChanged(CharSequence s, int start, int count, int after) { | |
} | |
@Override | |
public void onTextChanged(CharSequence s, int start, int before, int count) { | |
Filter filter = adapter.getFilter(); | |
filter.filter(s); | |
} | |
@Override | |
public void afterTextChanged(Editable s) { | |
} | |
}); |
Przede mną zapewne jeszcze jeden podobny adapter – ale tym razem dla obiektu Dinner. Mam nadzieję, że będzie z górki, skoro pierwsze koty za płoty 😉
Zamierzam jeszcze w przyszłości wrócić do implementacji tej listy, bo w planach mam co najmniej zaimplementowanie usuwania na zasadzie „swipe for dismiss” i dodanie później kolejnych pól do tej listy, żeby ViewHolder był bardziej rozbudowany niż jedno pole tekstowe 🙂
One thought on “obsłużmy listę – Filterable ArrayAdapter – #0F”