Skocz do zawartości
Macok

Pytanie dot. funkcji z tutoriala

Rekomendowane odpowiedzi

Macok

Jestem w trackie przerabiania tutoriala ze strony:

Android Developers

Nie za bardzo rozumiem sposób działania tej funkcji:

public boolean onContextItemSelected(MenuItem item) {
   switch(item.getItemId()) {
   case DELETE_ID:
       AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
       mDbHelper.deleteNote(info.id);
       fillData();
       return true;
   }
   return super.onContextItemSelected(item);
}

Wyrażenie info.id to numer notatki na liście, a funkcja mDbHelper.deleteNote() przyjmuje jako argument id notatki w bazie danych.

Czyli jeżeli mam 3 notatki:

Notatka 1

Notatka 2

Notatka 3

to jeśli usunę np. notatkę nr, 2 to pozycja notatki 3 zmieni się z 3 na 2, a jej id w bazie danych pozostanie takie samo.

Jak w takim razie działa ta funkcja?

Z góry dzięki za odp!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
gzajac
Wyrażenie info.id to numer notatki na liście, a funkcja mDbHelper.deleteNote() przyjmuje jako argument id notatki w bazie danych.

info.id to nie jest numer kolejny notatki na liście tylko jest to zamapowana wartość z kolumny _id z tabeli bazy danych - czyli identyfikator wiersza z tabeli.

Tutaj masz to samo napisane w dokumentacji - Excercise 1:

deleteNote() takes a rowId for a particular note, and deletes that note from the database.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Macok

Dzięki za odp.

Mógłbyś jeszcze wytłumaczyć, skąd w info.id pojawia się id notatki z bazy danych?

Domyślam się, że jest za to odpowiedzialna klasa AdapterContextMenuInfo, ale nie rozumiem jak dokładnie się to odbywa.

Edytowane przez Macok

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

AdapterContextMenuInfo otrzymuje ID w ListView z adaptera. Każdy item w adapterze posiada ID (otrzymujesz go poprzez funkcję getItemId). W bazodanowym adapterze ID jest pobierane z kolumny o nazwie _id. Jeśli chcesz to jakoś nadpisać (ja np. dodałem obsługę tego poza listview) tak na prawdę to chodzi o implementację interface'u ContextMenuInfo.

Jeśli nie masz problemów z analizą kodu polecam stronkę GrepCode.com - Java Source Code Search 2.0 , tam dowiesz się skąd co się bierze. Niestety dokumentacja SDK pozostawia wiele do życzenia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Macok

Niestety nie rozumiem.

AdapterContextMenuInfo dostaje ID, będące tak naprawdę pozycją wybranego obiektu w ListView.

Jak na podstawie tego ID klasa AdapterContextMenuInfo może odczytać ID obiektu z bazy danych?

Przecież AdapterContextMenuInfo nie dostaje nawet informacji o istnieniu tej bazy danych...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
gzajac
AdapterContextMenuInfo dostaje ID, będące tak naprawdę pozycją wybranego obiektu w ListView.

Nie - nie pozycją! Tylko ID w bazie danych (kolumna _id)

Jak na podstawie tego ID klasa AdapterContextMenuInfo może odczytać ID obiektu z bazy danych?

Wygląda mi na to że przepisałeś przykład bez większego zrozumienia - popatrz sobie na funkcję fillData() z Exercise 1. Jest tam taka linijka setListAdapter(notes) gdzie notes to CursorAdapter, czyli obiekt który dostarcza dane z bazy.

Przejrzyj dokładnie cały tutorial od Exercise 1, bo tam jest naprawdę całkiem ładnie wszystko opisane.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Macok
popatrz sobie na funkcję fillData()[/b] z Exercise 1. Jest tam taka linijka setListAdapter(notes) gdzie notes to CursorAdapter' date=' czyli obiekt który dostarcza dane z bazy.[/quote']

"Here, we retrieve the AdapterContextMenuInfo with getMenuInfo(). The id field of this object tells us the position of the item in the ListView. We then pass this to the deleteNote() method of our NotesDbAdapter and the note is deleted."

To zdanie znaczy chyba tyle, że pole info.id, o którym mowa zawiera pozycję obiektu na liście a nie id z bazy danych.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
gzajac

Jeszcze raz proponuję przeczytać Exercise 1, Step 12, aby zrozumieć jak podłącza się ListView do danych z bazy Sqlite.

Co do Twojego cytatu, to popatrz lepiej do dokumentacji klasy AdapterContextMenuInfo -> AdapterView.AdapterContextMenuInfo | Android Developers

Tam zobaczysz że

id

The row id of the item for which the context menu is being displayed.

a

position

The position in the adapter for which the context menu is being displayed.

BTW 1. Dokumentacja Android'a jest wielką porażką. Trzeba ją dokładnie czytać i uzupełniać wiadomości np. z doskonałych książek Marka Murphy'ego lub z Stack Overflow

BTW 2. Jeśli jesteś dociekliwy i chcesz dokładnie zrozumieć jak to działa, proponuję przejrzeć kody źródłowe Android'a, w szczególności klasy ListView, AbsListView, AdapterView.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.


  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.