Android ListView Item'ları Dinamik Olarak Düzenlemek

15-09-2014
Android uygulamasında ListView'in item'larını dilediğimiz gibi düzenlemek istiyorsak özel bir Adapter sınıfı oluşturmamız gerekmektedir. Adapter sınıfını Activity sınıfı içerisinde inner sınıf olarak tanımlayabiliriz. Bu işlemlerin nasıl gerçekleştiğini açıklamak için örnek bir uygulama yapalım.

Uygulamamızda ListView elementine custom bir layout ekleyeceğiz. Bu layout içerisinde hem TextView elementi hem de ImageView elementini kullanacağız. Uygulamanın amacı, belirli bir sonuca göre ImageView elementini göstermek/gizlemek ve TextView'in text'ini renkli yazdırmaktır.


Gereken Adımlar

1. ListView Layout
2. Custom ListView Item Layout
3. Custom ListView Item Sınıfı
4. Custom ArrayAdapter
5. Activity Sınıfı


ListView Layout (main.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              >
    <ListView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:divider="#ff80c6ee"
            android:dividerHeight="0.3dp"
            android:fadingEdgeLength="0dp"
            android:id="@+id/listWords"
            />
</LinearLayout>



Custom ListView Item Layout (view_list_item.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_height="match_parent"
              android:layout_width="wrap_content"
              android:orientation="horizontal">
 
    <ImageView
            android:id="@+id/ac_list_view_frequent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="5dip"
            android:paddingRight="5dp"
            android:src="@drawable/red_key_icon"
            android:contentDescription="@string/ac_home_img_description_verbs"/>
 
    <TextView
            android:id="@+id/ac_list_view_txt_content"
            android:layout_weight="1"
            android:textSize="20sp"
            android:paddingTop="5dip"
            android:paddingBottom="5dip"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textColor="#ff000000"/>
 
</LinearLayout>



Custom ListView Item Sınıfı
public class WordIdName implements Serializable {
    private long id;
    private String name;
    private WordType type;
    private boolean frequent;
    public long getId() {
        return id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public boolean isFrequent() {
        return frequent;
    }
 
    public void setFrequent(boolean frequent) {
        this.frequent = frequent;
    }
 
    @Override
    public String toString() {
        return name;
    }
}



Custom ArrayAdapter Sınıfı
private class MyAdapter extends ArrayAdapter<WordIdName> {
 
    public MyAdapter(Context context, int resource, int textViewResourceId, List<WordIdName> wordIdNames) {
        super(context, resource, textViewResourceId, wordIdNames);
    }
 
    /**
     * ListView elementi icerisinde ne kadar item varsa o kadar execute edilir
     * Ornegin 1000 tane item varsa 1000 kez bu metod calistirilir.
     * Ayrinti icin
     * <a href="http://stackoverflow.com/questions/12400338/explanation-of-the-getview-method-of-an-arrayadapter">
     *     tiklayiniz</a>
     * @param position 0 degerinden baslayarak item sayisi kadar artar. Itemlarin index'ini temsil eder
     * @param convertView
     * @param parent
     * @return
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //ListView elementinin position degerine gore item'ini getirir
        WordIdName wordIdName = super.getItem(position);
        //view nesnesi icerisinde hem ImageView hem de TextView barindirir. Cunku view_list_item layout
        View view = super.getView(position, convertView, parent);
        ImageView frequent = (ImageView) view.findViewById(R.id.ac_list_view_frequent);
        TextView content = (TextView) view.findViewById(R.id.ac_list_view_txt_content);
        if (!wordIdName.isFrequent()) {
            frequent.setVisibility(View.GONE);
            content.setTextColor(Color.RED);
        }
        return view;
    }
}



Activity Sınıfı
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        ListView listWords = (ListView) findViewById(R.id.listWords);
        ArrayAdapter<WordIdName> adapter = new MyAdapter(this,
                R.layout.view_list_item, R.id.ac_list_view_txt_content, getAllWordNames());
        registerForContextMenu(listWords);
        listWords.setAdapter(adapter);
    }
    public List<WordIdName> getAllWordNames() {
        ////////////
    }
}



Not: ArrayAdapter<WordIdName> şeklinde MainActivity sınıfında adapter nesnesi yaratıldığı için ListView nesnesi WordIdName item'larını listelemek için, bu sınıfın toString() metodunu çağırır. Dikkat ederseniz WordIdName sınıfında biz bu metodu override ettik.

© 2019 Tüm Hakları Saklıdır. Codesenior.COM