{"id":1608,"date":"2021-11-02T16:11:55","date_gmt":"2021-11-02T16:11:55","guid":{"rendered":"http:\/\/144.76.171.171\/blog\/?p=1608"},"modified":"2021-11-19T20:10:55","modified_gmt":"2021-11-19T20:10:55","slug":"android-eski-notlar-custom-arrayadapter-2","status":"publish","type":"post","link":"https:\/\/berenkudaygorun.com\/blog\/blog\/2021\/11\/02\/android-eski-notlar-custom-arrayadapter-2\/","title":{"rendered":"Custom ArrayAdapter \u2013 Android Eski Notlar#2"},"content":{"rendered":"<p>Bu videoda temel olarak nas\u0131l Custom ArrayAdapter yazabiliriz konusuna bakaca\u011f\u0131z. Bir ListView'im var. Ayn\u0131 zamanda bir layout \u00fczerinde bi tasar\u0131m olu\u015fturdum. Bu tasar\u0131mdaki verileri ListView'in i\u00e7erisine Adapter arac\u0131l\u0131\u011f\u0131 ile eklemeye \u00e7al\u0131\u015faca\u011f\u0131z.<\/p>\n<p>activity_main.xml kodlar\u0131<\/p>\n<pre><code class=\"language-xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;\n    xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;match_parent&quot;\n    tools:context=&quot;.MainActivity&quot;&gt;\n\n    &lt;ListView\n        android:id=&quot;@+id\/ulkelerListesi&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;match_parent&quot; \/&gt;\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/code><\/pre>\n<p>tek_satir_ulke.xml kodlar\u0131<\/p>\n<pre><code class=\"language-xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;\n    xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;wrap_content&quot;&gt;\n\n    &lt;Button\n        android:id=&quot;@+id\/button&quot;\n        android:layout_width=&quot;wrap_content&quot;\n        android:layout_height=&quot;wrap_content&quot;\n        android:layout_marginStart=&quot;16dp&quot;\n        android:layout_marginTop=&quot;12dp&quot;\n        android:text=&quot;Bilgi Al&quot;\n        app:layout_constraintStart_toStartOf=&quot;parent&quot;\n        app:layout_constraintTop_toTopOf=&quot;parent&quot; \/&gt;\n\n    &lt;TextView\n        android:id=&quot;@+id\/ulkeAdi&quot;\n        android:layout_width=&quot;wrap_content&quot;\n        android:layout_height=&quot;wrap_content&quot;\n        android:layout_marginStart=&quot;12dp&quot;\n        android:layout_marginTop=&quot;16dp&quot;\n        android:text=&quot;Ulke ad\u0131&quot;\n        app:layout_constraintStart_toEndOf=&quot;@+id\/space&quot;\n        app:layout_constraintTop_toTopOf=&quot;parent&quot; \/&gt;\n\n    &lt;TextView\n        android:id=&quot;@+id\/ulkeAciklamasi&quot;\n        android:layout_width=&quot;wrap_content&quot;\n        android:layout_height=&quot;wrap_content&quot;\n        android:layout_marginStart=&quot;12dp&quot;\n        android:layout_marginTop=&quot;16dp&quot;\n        android:text=&quot;\u00dclke A\u00e7\u0131klamas\u0131&quot;\n        app:layout_constraintStart_toEndOf=&quot;@+id\/space&quot;\n        app:layout_constraintTop_toBottomOf=&quot;@+id\/ulkeAdi&quot; \/&gt;\n\n    &lt;Space\n        android:id=&quot;@+id\/space&quot;\n        android:layout_width=&quot;wrap_content&quot;\n        android:layout_height=&quot;wrap_content&quot;\n        android:layout_marginStart=&quot;120dp&quot;\n        app:layout_constraintBottom_toBottomOf=&quot;parent&quot;\n        app:layout_constraintStart_toStartOf=&quot;parent&quot;\n        app:layout_constraintTop_toTopOf=&quot;parent&quot; \/&gt;\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/code><\/pre>\n<p>MainActivity.java kodlar\u0131<\/p>\n<pre><code class=\"language-java\">package com.example.customarrayadaptor;\n\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport android.content.Context;\nimport android.content.res.Resources;\nimport android.os.Bundle;\nimport android.widget.ListView;\n\npublic class MainActivity extends AppCompatActivity {\n    private ListView ulkelerListesi;\n    String[] ulkeler, ulkeTanimari;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        ulkelerListesi = findViewById(R.id.ulkelerListesi);\n\n        Resources veriKaynagi = getResources();\n        ulkeler = veriKaynagi.getStringArray(R.array.Ulkeler);\n        ulkeTanimari = veriKaynagi.getStringArray(R.array.UlkelerAciklama);\n\n        BenimAdapter adapter = new BenimAdapter(this, ulkeler, ulkeTanimari);\n        ulkelerListesi.setAdapter(adapter);\n\n    }\n}<\/code><\/pre>\n<p>\u015eimdi buradaki kodlar\u0131 incelemeye ba\u015flayal\u0131m. \u0130lk k\u0131s\u0131mlar\u0131 ge\u00e7iyorum bizim i\u00e7in \u00f6neli olan k\u0131s\u0131m a\u015fa\u011f\u0131daki k\u0131s\u0131md\u0131r.<\/p>\n<pre><code class=\"language-java\">BenimAdapter adapter = new BenimAdapter(this, ulkeler, ulkeTanimari);\n        ulkelerListesi.setAdapter(adapter);\n<\/code><\/pre>\n<p>Burada \u00f6zel bir class tan\u0131mlam\u0131\u015f\u0131z. \u015eimdi bu class'\u0131n i\u00e7ine bakal\u0131m. Ayn\u0131 zamanda setAdapter metodu AdapterView class'\u0131n\u0131n abstract bir metodudur. Ayn\u0131 zamanda bu class ListView'in \u00fcst class'lar\u0131ndand\u0131r.<\/p>\n<pre><code class=\"language-java\">package com.example.customarrayadaptor;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ArrayAdapter;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.w3c.dom.Text;\n\npublic class BenimAdapter extends ArrayAdapter {\n    Context context;\n    String[] ulkeAdlari;\n    String[] ulkeAciklamalari;\n\n    public BenimAdapter(Context context, String[] ulkeAdlari, String[] ulkeAciklamalari)\n    {\n\n        super(context, R.layout.tek_satir_ulke, R.id.ulkeAdi, ulkeAdlari);\n        this.ulkeAdlari = ulkeAdlari;\n        this.ulkeAciklamalari = ulkeAciklamalari;\n        this.context = context;\n\n        Log.i(&quot;test&quot;,&quot;tes&quot;);\n    }\n\n    @NonNull\n    @Override\n    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {\n        View tekSatir = convertView;\n        ViewTutucu tutucu = null;\n\n        if(tekSatir == null)\n        {\n            LayoutInflater layoutInflater =  LayoutInflater.from(this.context);\n            tekSatir = layoutInflater.inflate(R.layout.tek_satir_ulke, null);\n            tutucu = new ViewTutucu(tekSatir);\n            tekSatir.setTag(tutucu);\n        }\n        else\n        {\n            tutucu = (ViewTutucu) tekSatir.getTag();\n        }\n\n        tutucu.ulke.setText(this.ulkeAdlari[position]);\n        tutucu.tanim.setText(this.ulkeAciklamalari[position]);\n\n        return tekSatir;\n    }\n}\n\nclass ViewTutucu\n{\n    TextView ulke,tanim;\n    public ViewTutucu(View v)\n    {\n        ulke = v.findViewById(R.id.ulkeAdi);\n        tanim = v.findViewById(R.id.ulkeAciklamasi);\n    }\n}<\/code><\/pre>\n<p>Buras\u0131 kar\u0131\u015f\u0131k gelebilir. S\u0131ras\u0131yla \u00fcs\u00fcnde dural\u0131m.<br \/>\nBir class'\u0131m\u0131z var ArrayAdapter class'\u0131ndan miras al\u0131nm\u0131\u015f. Yap\u0131c\u0131 metodumuz a\u015fa\u011f\u0131da g\u00f6\u00fcld\u00fc\u011f\u00fc gibi.<\/p>\n<pre><code class=\"language-java\"> public BenimAdapter(Context context, String[] ulkeAdlari, String[] ulkeAciklamalari)\n    {\n\n        super(context, R.layout.tek_satir_ulke, R.id.ulkeAdi, ulkeAdlari);\n        this.ulkeAdlari = ulkeAdlari;\n        this.ulkeAciklamalari = ulkeAciklamalari;\n        this.context = context;\n\n        Log.i(&quot;test&quot;,&quot;tes&quot;);\n    }<\/code><\/pre>\n<p>\u00d6rnekleme yap\u0131l\u0131rken al\u0131nan parametreleri burada g\u00f6rebiliyoruz. Bu sayede asl\u0131nda strings.xml dosyas\u0131 alt\u0131ndaki verileri class'\u0131m\u0131za ta\u015f\u0131m\u0131\u015f olduk.<\/p>\n<p>strings.xml<\/p>\n<pre><code class=\"language-xml\">&lt;resources&gt;\n    &lt;string name=&quot;app_name&quot;&gt;CustomArrayAdaptor&lt;\/string&gt;\n\n    &lt;string-array name=&quot;Ulkeler&quot;&gt;\n        &lt;item&gt;T\u00fcrkiye&lt;\/item&gt;\n        &lt;item&gt;K\u0131br\u0131s&lt;\/item&gt;\n        &lt;item&gt;Bulgaristan&lt;\/item&gt;\n        &lt;item&gt;Yunanistan&lt;\/item&gt;\n    &lt;\/string-array&gt;\n\n    &lt;string-array name=&quot;UlkelerAciklama&quot;&gt;\n        &lt;item&gt;T\u00fcrkiye \u00fclkesidir.&lt;\/item&gt;\n        &lt;item&gt;K\u0131br\u0131s \u00fclkesidir.&lt;\/item&gt;\n        &lt;item&gt;Bulgaristan \u00fclkesidir.&lt;\/item&gt;\n        &lt;item&gt;Yunanistan \u00fclkesidir.&lt;\/item&gt;\n    &lt;\/string-array&gt;\n&lt;\/resources&gt;<\/code><\/pre>\n<p>ArrayAdapter class'\u0131ndaki getView metodunu Override ederek i\u015flemlerimize devam edece\u011fiz. Bu metot <code>super(context, R.layout.tek_satir_ulke, R.id.ulkeAdi, ulkeAdlari);<\/code> metodundaki <code>ulkeAdlari<\/code> de\u011fi\u015fkeni kadar \u00e7al\u0131\u015fmaktad\u0131r. Bu sayede position bilgisiyle s\u00fcrekli olarak yeni de\u011ferler ekrana yaz\u0131lmaktad\u0131r.<\/p>\n<pre><code class=\"language-java\">@NonNull\n    @Override\n    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {\n        View tekSatir = convertView;\n        ViewTutucu tutucu = null;\n\n        if(tekSatir == null)\n        {\n            LayoutInflater layoutInflater =  LayoutInflater.from(this.context);\n            tekSatir = layoutInflater.inflate(R.layout.tek_satir_ulke, null);\n            tutucu = new ViewTutucu(tekSatir);\n            tekSatir.setTag(tutucu);\n        }\n        else\n        {\n            tutucu = (ViewTutucu) tekSatir.getTag();\n        }\n\n        tutucu.ulke.setText(this.ulkeAdlari[position]);\n        tutucu.tanim.setText(this.ulkeAciklamalari[position]);\n\n        return tekSatir;\n    }<\/code><\/pre>\n<p>S\u00f6zde kod mant\u0131\u011f\u0131 ile anlatmay\u0131 deneyece\u011fim. <code>convertView<\/code> dedi\u011fimiz yap\u0131 asl\u0131nda garbage collector arac\u0131l\u0131\u011f\u0131 ile kullan\u0131lmayan verileri silmemizi engelliyor. Yanl\u0131\u015f duymad\u0131n\u0131z \ud83d\ude42 Burada asl\u0131nda s\u00fcerekli oalrak CPU'yu yormaktay\u0131z \u00e7\u00fcnk\u00fc inflater arac\u0131l\u0131\u011f\u0131 ile XML'den bir View objesi olu\u015fturmaya \u00e7al\u0131\u015f\u0131yoruz.. \u0130lk ba\u015fta <code>convertView<\/code> de\u011feri null olacakt\u0131r. E\u011fer null'sa if blo\u011funun i\u00e7ine girerek <code>tek_satir_ulke.xml<\/code> dosyas\u0131ndan bir View olu\u015fturmay\u0131 deneyecek ve bunu <code>activity_main.xml<\/code> i\u00e7indeki ListView'e g\u00f6nderecek. Bu esnada <code>ViewTutucu<\/code> isimli bir class kar\u015f\u0131m\u0131za \u00e7\u0131k\u0131yor.<\/p>\n<pre><code class=\"language-java\">\nclass ViewTutucu\n{\n    TextView ulke,tanim;\n    public ViewTutucu(View v)\n    {\n        ulke = v.findViewById(R.id.ulkeAdi);\n        tanim = v.findViewById(R.id.ulkeAciklamasi);\n    }\n}<\/code><\/pre>\n<p>Asl\u0131nda bu class <code>tek_satir_ulke.xml<\/code> dosyas\u0131 i\u00e7eriesindeki TextView'lere eri\u015fmemizi ve i\u00e7ini doldurmam\u0131z\u0131 sa\u011flayacakt\u0131r. Her seferinde tekrar tekrar eri\u015fmeye \u00e7al\u0131\u015fmak performans kayb\u0131 olaca\u011f\u0131 i\u00e7in ayr\u0131 bir class'ta yaz\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p>Daha sonras\u0131nda setTag ve getTag'ler yard\u0131m\u0131 ile <code>position<\/code> bilgisine g\u00f6re ifadeler doldurulur.<\/p>\n<pre><code class=\"language-java\"> tutucu.ulke.setText(this.ulkeAdlari[position]);\n        tutucu.tanim.setText(this.ulkeAciklamalari[position]);\n\n        return tekSatir;<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Bu videoda temel olarak nas\u0131l Custom ArrayAdapter yazabiliriz konusuna bakaca\u011f\u0131z. Bir ListView&#8217;im var. Ayn\u0131 zamanda bir layout \u00fczerinde bi tasar\u0131m olu\u015fturdum. Bu tasar\u0131mdaki verileri ListView&#8217;in&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/berenkudaygorun.com\/blog\/blog\/2021\/11\/02\/android-eski-notlar-custom-arrayadapter-2\/\">Devam\u0131n\u0131 oku<span class=\"screen-reader-text\">Custom ArrayAdapter \u2013 Android Eski Notlar#2<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[363],"tags":[626],"class_list":["post-1608","post","type-post","status-publish","format-standard","hentry","category-android","tag-arrayadapter","entry"],"_links":{"self":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts\/1608","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/comments?post=1608"}],"version-history":[{"count":2,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts\/1608\/revisions"}],"predecessor-version":[{"id":1651,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts\/1608\/revisions\/1651"}],"wp:attachment":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/media?parent=1608"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/categories?post=1608"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/tags?post=1608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}