Kursory i zadania asynchroniczne
707
jesteś tutaj
activity_
top_level.xml
package com.hfad.coffeina;
...
public class TopLevelActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_top_level);
setupOptionsListView();
}
private void setupOptionsListView() {
// Implementacja obiektu OnItemClickListener
AdapterView.OnItemClickListener itemClickListener =
new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> listView,
View itemView,
int position,
long id) {
if (position == 0) {
Intent intent = new Intent(TopLevelActivity.this,
DrinkCategoryActivity.class);
startActivity(intent);
}
}
};
// Dodajemy obiekt nasłuchujący do widoku ListView
ListView listView = (ListView) findViewById(R.id.list_options);
listView.setOnItemClickListener(itemClickListener);
}
}
Refaktoryzacja pliku TopLevelActivity.java
Zanim napiszemy jakikolwiek kod związany z naszym nowym widokiem
listy, musimy wprowadzić pewne modyfikacje w kodzie aktywności
TopLevelActivity
. Dzięki niemu nasz kod stanie się znacznie łatwiejszy
do czytania i analizy. Cały kod związany z widokiem listy prezentującym
opcje przeniesiemy do nowej metody,
setupOptionsListView()
.
Tę nową metodę będziemy wywoływać w metodzie
onCreate()
.
Oto nasza nowa wersja kodu pliku
TopLevelActivity.java (zmodyfikuj ten
plik w swoim projekcie, by był identyczny z naszym):
app/src/main
TopLevel
Activity.java
Coffeina
java
com.hfad.coffeina
Cały ten
fragment
kodu
znajdował
się wcześniej
w metodzie
onCreate().
Przenosimy
go do nowej
metody, aby
uporządkować
kod.
Wywołujemy nową metodę,
setupOptionsListView().
Jeśli w widoku listy
list_options została
kliknięta opcja Napoje, to
uruchamiamy aktywność
DrinkCategoryActivity.
¨
Aktualizacja układu
¨
Wypełnienie widoku listy
¨
Odświeżenie danych
708
Rozdział 17.
Modyfikacja aktywności TopLevelActivity
Jakie zmiany trzeba wprowadzić
w kodzie aktywności TopLevelActivity?
W widoku listy
list_favorites
dodanym do układu aktywności musimy wyświetlić
ulubione napoje użytkownika i zadbać o to, by lista ta reagowała na kliknięcia.
W tym celu musimy wykonać następujące czynności:
Wypełnić widok listy list_favorites, używając kursora.
Kursor będzie zawierał wszystkie napoje, w których kolumna
FAVORITE
będzie miała wartość
1
— czyli wszystkie napoje, które użytkownik
oznaczył jako ulubione. Podobnie jak zrobiliśmy to w kodzie aktywności
DrinkCategoryActivity
, także tu możemy połączyć widok
ListView
z kursorem, używając adaptera typu
CursorAdapter
.
Widok
ListView
Adapter
CursorAdapter
Baza danych
Kursor
Zaimplementować obiekt nasłuchujący OnItemClickListener,
tak by widok listy list_favorites mógł reagować na kliknięcia.
Kiedy użytkownik kliknie któryś ze swoich ulubionych napojów,
utworzymy intencję, która uruchomi aktywność
DrinkActivity
,
i przekażemy do tej intencji identyfikator klikniętego napoju. Dzięki
temu aplikacja wyświetli szczegółowe informacje o wybranym napoju.
TopLevelActivity
DrinkActivity
Intencja
drinkId
Już znasz cały kod, który jest potrzebny do zaimplementowania tych możliwości. W rzeczywistości jest on niemal
identyczny z kodem, który napisaliśmy w poprzednich rozdziałach do kontroli listy napojów prezentowanej
w aktywności
DrinkCategoryActivity
. Jedyna różnica polega na tym, że tym razem chcemy wyświetlać
wyłącznie te napoje, które w kolumnie
FAVORITE
mają wartość
1
.
Zdecydowaliśmy się umieścić kod obsługujący ten widok listy w nowej metodzie, o nazwie
setupFavoritesListView()
.
Metodę tę przedstawimy na kolejnej stronie, a następnie dodamy do pliku
TopLevelActivity.java.
1
2
Latte
Cappuccino
Filter
¨
Aktualizacja układu
¨
Wypełnienie widoku listy
¨
Odświeżenie danych
Kursory i zadania asynchroniczne
709
jesteś tutaj
private void setupFavoritesListView() {
// Wypełniamy widok ListView list_favorites danymi z kursora
ListView listFavorites = (ListView) findViewById(R.id.list_favorites);
try{
SQLiteOpenHelper coffeinaDatabaseHelper = new CoffeinaDatabaseHelper(this);
db = coffeinaDatabaseHelper.getReadableDatabase();
favoritesCursor = db.query(”DRINK”,
new String[] { ”_id”, ”NAME”},
”FAVORITE = 1”,
null, null, null, null);
CursorAdapter favoriteAdapter =
new SimpleCursorAdapter(TopLevelActivity.this,
android.R.layout.simple_list_item_1,
favoritesCursor,
new String[]{”NAME”},
new int[]{android.R.id.text1}, 0);
listFavorites.setAdapter(favoriteAdapter);
} catch(SQLiteException e) {
Toast toast =
Toast.makeText(this, ”Baza danych nie jest dostępna”, Toast.LENGTH_SHORT);
toast.show();
}
// Po kliknięciu ulubionego napoju przechodzimy do aktywności DrinkActivity
listFavorites.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> listView, View v, int position, long id){
Intent intent = new Intent(TopLevelActivity.this, DrinkActivity.class);
intent.putExtra(DrinkActivity.EXTRA_DRINKID, (int)id);
startActivity(intent);
}
});
}
Metoda setupFavritesListView() wypełnia
widok listy list_favorites nazwami
ulubionych napojów użytkownika. Zanim
przejdziesz na następną stronę, upewnij się,
że dobrze rozumiesz działanie jej kodu.
app/src/main
TopLevel
Activity.java
Coffeina
java
com.hfad.coffeina
Pobieramy nazwy
ulubionych napojów
użytkownika.
Pobieramy widok listy
o identyfikatorze list_favorites.
Tworzymy kursor, który
pobiera wartości kolumn
_id i NAME z wierszy,
w których FAVORITE=1.
Jeśli użytkownik kliknie jeden z elementów
listy list_favorites, tworzymy intencję
uruchamiającą aktywność DrinkActivity,
zapisując w niej, jako informację dodatkową,
identyfikator klikniętego napoju.
W przypadku jakichś problemów z bazą danych wyświetlamy komunikat.
Ta metoda zostanie
wywołana po
kliknięciu jednego
z elementów
wyświetlonych
na liście.
Wyświetlamy nazwy napojów
na liście.
Używamy
kursora w
adapterze.
Tworzymy nowy
adapter typu
CursorAdapter.
Kod gotowy
do użycia
¨
Aktualizacja układu
¨
Wypełnienie widoku listy
¨
Odświeżenie danych
Get Android Programowanie aplikacji. Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.