ListView - wyświetlenie danych pobranych z bazy

0

Witam,

Piszę pewną aplikację na Androida, która wykorzystuje bazę danych SQLite.
W klasie obsługującej bazę jest metoda pobierająca wszystkie rekordy i dodająca je do listy.

Mam klasę ListItemActivity.java która ma za zadanie obsłużyć wyświetlenie pobranych danych jako listę.
Poniżej przedstawiam metodę która pobiera dane z bazy:

    public List<Item> getAllItems(){
        List<Item> itemList = new ArrayList<Item>();
        
        String selectQuery = "SELECT * FROM " + TABLE_ITEMS;
        
        SQLiteDatabase database = this.getWritableDatabase();
        Cursor cursor = database.rawQuery(selectQuery, null);
        
        if(cursor.moveToFirst()){
            do{
                Item item = new Item();
                item.setID(Integer.parseInt(cursor.getString(0)));
                item.setImie(cursor.getString(1));
                item.setNazwisko(cursor.getString(2));
                item.setTelefon(cursor.getString(3));
                itemList.add(item);
            }while(cursor.moveToNext());
        }
    
        return itemList;
    }

A tutaj klasę, która ma za zadanie wyświetlić listę.

public class ListViewActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final DBHandler database = new DBHandler(this);
        final List<Item> item;
        
        item = database.getAllItems(); //pobranie wszystkich danych z bazy
        
        ArrayAdapter<Item> adapter = new ArrayAdapter<Item>(this, R.layout.list, item);
        
        setListAdapter(adapter);
        
        ListView listView = getListView();
        listView.setTextFilterEnabled(true);
        
        listView.setOnItemClickListener(new OnItemClickListener(){
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                // na razie pusto           
            }
        });
        
    }
    
}

No i teraz pytanie czy da się to w jakiś sposób łatwo wyświetlić? Teraz na liście wyświetlają się śmieci typu <nazwa_pakietu>.Item@<jakiesZnaki>.
Generalnie to z bazy pobieram jakieś dane z kilku kolumn (Imie, Nazwisko, Telefon) co widać w kodzie.
Mam w klasie Item zaimplementowane metody getImie, getNazwisko, getTelefon.
Teraz zastanawiam się jak to w jakiś prosty sposób wyświetlić za pomocą ArrayAdapter?

1

Obecnie wyświetla, jak to nazwałeś "śmieci", bo domyślna implementacja funkcji toString() dla klasy to zwrócenie jej hasz kodu.
Rozwiązaniem Twojego problemu, jest nadpisanie funkcji toString() w klasie Item np. tak:

@Override
public String toString()
{
return getImie() + getNazwisko();
}

0

Ok dzięki, faktycznie podziałało, natomiast mam teraz jeszcze jedno pytanie. Załóżmy, że chcę wyświetlić sobie wartości (Imie, Nazwisko, Telefon) w kolejnych polach *TextView *, a nie wszystkie w jednym polu łącząc w jeden String.
Przykładowo w widoku miałoby to być wyświetlane w taki sposób:

Imie
Nazwisko
Telefon

Muszę zaimplementować własny Adapter? Czy jest jakiś łatwiejszy sposób?

0

Co masz na myśli mówiąc "kolejne pola TextView"?
Chcąc wyświetlić 3 niezależne wiersze tekstu, deklarujesz po prostu dla każdego oddzielnie TextView. No chyba, że chcesz to wepchnąć w jedno TextView i podać String w stylu "Jan\nKowalski\n070070070", ale nie polecam tego rozwiązania.
btw. TextView nie potrzebuje adaptera, bo jego przeznaczeniem jest zawsze obiekt typu String.

0

Źle się wyraziłem z tym TextView. Chodzi oczywiście o ListView na zasadzie takiej jak pokazałem wyżej. Czyli, kolejne dane z kolumn bazy wypisywane pod sobą.

Imie
Nazwisko
Telefon
0

Idea jest taka: adapter pracujący na jakimś typie (np. Item) zapewnia dane ListView, gdzie typ jest odwzorowywany na JEDEN wiersz ListView . Dokładnie rzecz biorąc robi to metoda getView.
Jeśli swój Item, chcesz wyświetlić w 3 wierszach, to znaczy... że obiekt Item jest Ci zupełnie zbędny aka. błędnie zamodelowałeś problem.
Zrób prosty ArrayAdapter<String> gdzie, załadujesz wszystkie rekordy z bazy i tyle.

Swoją drogą jaki jest sens w liście:
Imie
Nazwisko
Telefon
Imie
Nazwisko
Telefon
Imie
Nazwisko
Telefon
...

?

0

Tzn póki co testuję trochę bo z Androidem mam dość krótko styczność. Ogólnie w całym moim zadaniu, które docelowo chce zrobić jest coś takiego.
Mam w bazie 2 tabele (tu póki o drugiej nie wspominałem bo na razie chciałbym uporać się z obsługą jednej). Jedna z nich np. Klient, druga Grupa
W tabeli Klient są właśnie np. takie dane jak Imie, Nazwisko, Telefon, natomiast druga tabela Grupa zawiera nazwę grupy do której należą osoby.
I teraz moim zamysłem jest zrobić coś takiego. Na początkowym widoku, wyświetla mi się lista grup jakie są stworzone (dane będą też pobierane z bazy o tych grupach oczywiście).
Po kliknięciu na grupę przechodzimy do kolejnego widoku, który wyświetla nam kolejną listę osób należących do tej grupy, ale tylko imię i nazwisko.
No i na samym końcu po kliknięciu na imię i nazwisko mamy wyświetlone dane o delikwencie, to już się na TextView zrobi zapewne, wsadzając już wszystkie dane osoby.

1
  1. Napisz sobie klasy encyjne: Klient i Grupa, gdzie załadujesz wszystkie dane z bazy. Powinieneś odwzorować obiekty z bazy na klasy, czyli stworzyć sobie prosty ORM.
  2. Utwórz odpowiednie widoki ListView.
  3. Dla każdego z widoku będziesz miał inny ArrayAdpater, pracujący na innym Itemie np.:
    dla widoku z klientami z danej grupy, stwórz np. ClientItem, ktory będzie miał 2 pola (Imie, Nazwisko), które podasz mu z klasy encyjnej Klient.
  4. Analogicznie stworzysz GroupItem i DetailsClientItem i zasilisz je danymi z klas encyjnych.

nie bój się tworzyć wielu nowych klas :)

0

Dzięki za naprowadzenie, będę walczył, choć to można by powiedzieć początki z tą technologią :).

0

Przepraszam za praktykowanie archeologii, mam podobny problem i chyba potrzebuje pomocy kogos innego niz ja sam. W androidzie programuje od bardzo niedawna, obecnie zglebiam zagadnienie SQLite. Pobieram z bazy szereg wynikow i przypisuje je do listy. W efekcie mam podobna funkcje, ktora zwraca List<Klasa>. Problem w tym, ze nie wiem dobrze jak wyswietlic jej konkretne wiersze. Aby byc szczerym, lece zywcem z [url=http://andrzejklusiewicz-android.blogspot.com/2014/02/baza-sqlite-w-androidzie.html]tego[/url] poradnika i chodzi mi o ostatni fragment kodu: [img]http://1.bp.blogspot.com/-37b3Yd5kQYE/UwJKcqVr5jI/AAAAAAAABZc/y7-MPjNKBgU/s1600/30.png[/img]
Zapewne rozwiazanie jest wrecz trywialne, natomiast z java pierwszy raz spotkalem sie kilka dni temu i taki to juz chyba moj los, by utykac na najprostszych linijkach kodu (choc zazwyczaj google pomaga).

1 użytkowników online, w tym zalogowanych: 0, gości: 1