Witaj Sieciowy Szperaczu :)
Wiedz, że nie znajdziesz tutaj kodów źródłowych ani poradników jak kodzić dobre i przemyślane aplikacje na Androida.

Za to zobaczysz moje wolne przemyślenia, porady i pomysły. Dowiesz się też z czym miałem problemy, które napotkałem podczas swojej przygody z 'Andkiem' oraz, co ważniejsze, ich rozwiązania.
Pokazywanie postów oznaczonych etykietą ListView. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą ListView. Pokaż wszystkie posty

piątek, 24 czerwca 2011

Androidowa Adaptacja, czyli Adapter i getView

'Ciekawe' pomyślałem, bo z jednej strony to dobrze, a z drugiej źle. Tak to już jest, wszystko ma plusy i minusy. No ale 'osochozi'?

Dzisiaj robiłem sobie prostą listę, którą podpiąłem do widoku jako ListView. Oczywiście nie chciałem aby wyglądała standardowo, dlatego musiałem stworzyć własny Adapter, a dokładniej ArrayAdapter. Miała to być lista z ikonkami po boku:

1
public class MyIconAdapter extends ArrayAdapter<Object>

Potem należało nadpisać metodę getView i wpisać dowolny kod.

1
2
@Override
public View getView(int position, View convertView, ViewGroup parent)

I w tym momencie, nareszcie, dochodzimy do meritum tego posta :)
Jeśli lista jest zbyt długa, żeby wyświetlić ją na ekranie to podczas przesuwania ekranu za każdym razem, dla kolejnych elementów wywoływana jest metoda getView! Czyli każdy element jest 'generowany' na bieżąco, a po starcie aplikacji wczytywane są tylko elementy widoczne.

Może parę słów dlaczego? Otóż programiści Androida w ten sposób wyłuskują ograniczenie zjadania pamięci, niepotrzebnych obliczeń, a co za tym idzie, również mniejsze zużycie baterii. Dobry pomysł! Chociaż przy listach większych gabarytów potrafi przymulić ;)

wtorek, 14 czerwca 2011

setContentView(R.layout.main); a ListActivity

Kolejny dzień, kolejny problem.
Co się stało? Chcąc pobawić się adapterami w Androidzie, po napisaniu kodu aplikacja cały czas się wysypywała, nie wiedzieć dlaczego, skoro kod był prosty, czysty i przejrzysty.
Moja główna klasa dziedziczyła po ListActivity zamiast Activity, co za tym idzie, przy osadzaniu listy w widoku, w ten sposób:




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends ListActivity {
 TextView selection;
 String[] items = {"lody", "burak", "cos", "Cluedo", "lampka", "wazon",
       "inne", "samochod"};
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
                        
        setListAdapter(new ArrayAdapter<String>(
             this, 
             android.R.layout.simple_list_item_1, 
             items));        
                               
    }
}


Dlaczego kod nie działa? Dziwnym trafem, którego póki co nie jestem w stanie wytłumaczyć, wadzi tutaj setContentView(R.layout.main);. Kiedy się pozbędziemy tego, wszystko jest OK.
Rozwiązanie
Wszystko się wyjaśniło. W pliku odpowiedzialnym za widok (layout/main.xml):
1
2
3
4
5
6
7
<ListView 
 android:id="@android:id/list"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:drawSelectorOnTop="true"
 > 
</ListView>

Należy tutaj pamiętać, aby naszemu ListView nadać id o wartości: android:id="@android:id/list". Trzeba to zrobić, aby klasa dziedzicząca po ListActivity wiedziała, który ListView jest tym głównym. Bez tego ani rusz. Sprawa rozwiązana :)