Android Programlama – ListView, Spinner, AutoCompleteTextView, Adapter
Merhaba arkadaşlar, bu yazımızda daha önceki yazımızda geliştirdiğimiz form uygulamasını biraz daha geliştireceğiz. Bu uygulamamızda bir önceki uygulamaya listview ekleyeceğiz. Bir önceki yazımızı okumayanlar buradan okuyabilir. Okumak istemeyenler bir önceki uygulamayı indirip üzerinde devam edebilirler.
Bu uygulamamızda model dosyamızı geliştireceğiz ve liste tutabilecek hale getireceğiz. Böylece tek bir kitap tutmak yerine kitap listesi tutan bir yapı elde edeceğiz. Ardından Programımızın ana ekranına bir listView ekleyerek model dosyamızda bulunan kitapların listesini kullanıcıya göstereceğiz. Bu uygulamamızda sadece kitapları kullanıcıya sunacağız. Herhangi bir değiştirme ve silme işlemi yapmayacağız. Bu işlemleri daha sonraki yazılarımızda ele alacağız.
Ana activity dosyamızda bulunan
yerine
List<Book> books = new ArrayList<Book>(); |
yazıyoruz. Böylece kitapların listesini tutabileceğiz.
Bu noktadan sonra
kodunu local olması için onClick(View v){} fonksiyonu içine alıyorum. Yani fonksiyonumuz şu hale geliyor.
public void onClick(View v) { //local olması için buraya taşıdık. Book b = new Book(); EditText name = (EditText)findViewById(R.id.name); EditText author = (EditText)findViewById(R.id.author); b.setName(name.getText().toString()); b.setAuthor(author.getText().toString()); RadioGroup types=(RadioGroup)findViewById(R.id.types);//radio buttonlardan seçeneği alıyoruz //aldığımız seçenği switch ile ilgili şekilde kaydediyoruz. switch (types.getCheckedRadioButtonId()) { case R.id.adventure: b.setType("adventure"); break; case R.id.biography: b.setType("biography"); break; case R.id.documentary: b.setType("documentary"); break; } } |
Bu haliyle tabiki kitabımızı elde tutamıyoruz. Çünkü scope dışına çıkıldığında değişkeni kaybediyoruz. Bu hatayı birazdan listeye ekleyerek halledeceğiz ancak öncelikle book classımıza toString() fonksiyonu ekleyeceğiz ki listView üzerinden kitaplarımızı çağırabilelim.
Book.java dosyamız şu hale geliyor.
package kodmerkezi.net.basitForm; public class Book { private String name=""; private String author=""; private String type=""; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } //ListView içerisinden çağrılırken kullanacağız public String toString() { return(getName()); } } |
Şimdi geldik püf noktaya, Layout üzerine ListView ekleyeceğiz. Biz şöyle yapacağız. Formumuzun üzerinde kitaplarımızın listesi görünecek. Bunun için main.xml dosyamızda şöyle değişiklikler yapıyoruz.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TableLayout android:id="@+id/details" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:stretchColumns="1" > <TableRow > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="İsmi:" /> <EditText android:id="@+id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </TableRow> <TableRow > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Yazar:" /> <EditText android:id="@+id/author" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </TableRow> <TableRow> <TextView android:text="Cinsi:" /> <RadioGroup android:id="@+id/types"> <RadioButton android:id="@+id/adventure" android:text="Adventure" android:checked="true" /> <RadioButton android:id="@+id/biography" android:text="Biography" /> <RadioButton android:id="@+id/documentary" android:text="Documentary" /> </RadioGroup> </TableRow> <Button android:id="@+id/save" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Kaydet" /> </TableLayout> <ListView android:id="@+id/books" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_above="@id/details" /> </RelativeLayout> |
Burada bütün elemanlarımızı RelativeLayout içerisine aldık. Böylece hangi elemanın nerede duracağına rahatlıkla müdahele edebileceğiz. Yani mesele listview, tableLayoutun üzerinde olsun gibi komutlar yazabileceğiz. ScrollView elemanını kaldırdık, ve TableLayoutun yüksekliği için android:layout_height=”wrap_content” yazdık. Böylece yüksekliği içeriğine göre kendisi ayarlayacak. En altta ListView ekledik ve yine aynı şekilde yüksekliğini android:layout_height=”wrap_content” şeklinde ayarladık. Ancak android:layout_above=”@id/details” komutu ile listView elemanımız “details” id li yani TableLayout umuzun üzerine konuşlanacak.
Şimdi ise boş olan ListView elemanımızı kaynağa bağlamamız gerekiyor. Bunun için ArrayAdapter tanımlayacağız ve listemiz ile bağlayacağız.Yeni elemanları adapter.add() şeklinde ekledikçe yeni eklenen elemanlar hem listemize eklenecek hemde ekranda görünecek. Buraya dikkat etmemiz gerekir.Elemanları direk olarak listeye eklersek adaptör bunu anlayamaz ve ekranda göremeyiz.
package kodmerkezi.net.basitForm; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.RadioGroup; public class BasitFormActivity extends Activity { //Kitapları Liste halinde tutacağımız için ArrayList cinsinde tanımlıyoruz List<Book> books = new ArrayList<Book>(); //ListView ile bağlantıyı kuracak adaptörümüz ArrayAdapter<Book> adapter=null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //dinamik olarak java kodlarıyla radio button ekleme // RadioGroup radioGroup =(RadioGroup)findViewById(R.id.types); // RadioButton rb = new RadioButton(getBaseContext()); // rb.setText("Other"); //radioGroup.addView(rb); Button save = (Button)findViewById(R.id.save); save.setOnClickListener(onSave); //main.xml dosyamızdaki listView e erişim sağlıyoruz ListView list=(ListView)findViewById(R.id.books); //adaptörümüzü yaratıyoruz.İlk eleman bulunduğumuz sınıfı işaret ediyor //2. eleman listView satırlarımızın temasını ifade ediyor.simple_list_item_1 temasına göre sadece beyaz bir yazı gelecek her satırda //3. eleman Listemizi gösteriyor adapter = new ArrayAdapter<Book>(this, android.R.layout.simple_list_item_1, books); //ListView ile adaptör bağlantısını sağlıyoruz list.setAdapter(adapter); } private View.OnClickListener onSave = new View.OnClickListener() { public void onClick(View v) { //local olması için buraya taşıdık. Book b = new Book(); EditText name = (EditText)findViewById(R.id.name); EditText author = (EditText)findViewById(R.id.author); b.setName(name.getText().toString()); b.setAuthor(author.getText().toString()); RadioGroup types=(RadioGroup)findViewById(R.id.types);//radio buttonlardan seçeneği alıyoruz //aldığımız seçenği switch ile ilgili şekilde kaydediyoruz. switch (types.getCheckedRadioButtonId()) { case R.id.adventure: b.setType("adventure"); break; case R.id.biography: b.setType("biography"); break; case R.id.documentary: b.setType("documentary"); break; } //adaptöre yeni elemanı ekliyoruz. adapter.add(b); } }; } |
Şimdi bir kaç örnek kitap ekleyelim.
Eğer ListView yerine Spinner(dropDown Menü) kullanmak istersek bir kaç noktayı değiştirmemiz gerekecek. İlk olarak main.xml dosyasında ListView yerine şunu koyacağız.
<Spinner android:id="@+id/books" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_above="@id/details" /> |
Daha sonra Ana activity dosyamızda ListView yerine şu satırı koyacağız,
Spinner list=(Spinner)findViewById(R.id.books); dapter = new ArrayAdapter<Book>(this, android.R.layout.simple_spinner_item, books); |
Ekran görüntümüz bu hali alacak.
Son olarak kitap yazarlarımızı AutoComplete yapalım. Yani yazar ismi girilmeye başlandığında tahminler gözüksün.
Bunun için ilk olarak yazar ismini girdiğimiz editText elemanını AutoCompleteTextView e çeviriyoruz.
<AutoCompleteTextView android:id="@+id/author" android:layout_width="fill_parent" android:layout_height="wrap_content" /> |
Daha sonra Activity içerisinde String arrayi ile yazar isimlerini giriyorum.Bunu onCreate metodunun hemen üzerinde yapıyorum.
private static final String[] AUTHORS = new String[] { "Gurcan Kavakçı", "Mehmet S.", "Ali T.", "Hasan G.", "Saffet C." }; |
Son olarak bu isimleri AutoCompleteTextView e adaptör yardımıyla bağlıyorum.
ArrayAdapter<String> adapter_author = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, AUTHORS); AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.author); textView.setAdapter(adapter_author); |
Böylece yazar ismi girmeye başladığımızda tahminler altta çıkmaya başlıyor.
Bu yazımızda genel olarak listView, Spinner,Adaptor,AutoCompleteTextView lerden bahsettik. Sonraki yazılarımda bunları geliştirmeye devam edeceğiz. Takipte kalın!
Projenin kaynak kodlarını buradan indirebilirsiniz. Rar şifresi: www.kodmerkezi.netBunlara da Göz Atmak İsteyebilirsiniz.
<<< Önceki: Android Programlama – TableLayout, Radio Button
Sonraki: Android Programlama – Özelleştirilmiş ListView >>>
Yorum Bırakın!