obsłużmy listę – Filterable ArrayAdapter – #0F

Lista posiłków – taki mały, wielki komponent:

wp-1491113369523.png

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

wp-1491112687494.png

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:


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:


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 🙂

Jedna uwaga do wpisu “obsłużmy listę – Filterable ArrayAdapter – #0F

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.