24 września 2011

ListView w res/layout czy android.app.ListActivity?

To chyba jedno z tych pytań dotyczących zalet definiowania widoku (rozkładu elementów graficznych na ekranie) deklaratywnie jako zasób w res/layout w porównaniu z oprogramowywaniem go jako podklasa android.app.Activity.

W przykładzie Hello, Views > List View użyto tego drugiego podejścia, w którym widok w większości budowany jest w ramach podklasy android.app.ListActivity z rozkładem R.layout.list_item.

Przeglądając android.widget.ListView trafiłem na możliwość definiowania wielu elementów deklaratywnie, tak że ostatecznie moja wersja prezentuje się nieznacznie inaczej. Chciałoby się wręcz napisać lepiej, ale tutaj moja skromność bierze górę, więc pozostanę przy skromniej.
package pl.japila.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ContactsActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.main);

        ListView lv = (ListView) findViewById(R.id.listView1);
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}
Użyty widok R.id.listView1 wygląda następująco:
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/listView1"
     android:layout_height="fill_parent""
     android:layout_width="fill_parent""
     android:entries="@array/names_array"
     android:textFilterEnabled="true"
     android:clickable="true">
</ListView>
Rozumiem, że jeśli pozycje na liście są statyczne (jak w przykładzie) to android:entries (linia 6) w znaczniku ListView wystarczy. Zastanawia mnie, czy istnieje jakakolwiek przewaga użycia klasy android.app.ListActivity. Na chwilę obecną nie widzę żadnej. W końcu zawsze mogę dostać się do odpowiedniego elementu widoku przez View.findViewById() lub Activity.findViewById(), więc mogę równie wiele w obu przypadkach. Czy ktoś mógłby uchylić rąbka tajemnicy, dlaczego/kiedy powinienem stosować jedno nad drugie?