{"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&#8217;im var. Ayn\u0131 zamanda bir layout \u00fczerinde bi tasar\u0131m olu\u015fturdum. Bu tasar\u0131mdaki verileri ListView&#8217;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&#8217;\u0131n i\u00e7ine bakal\u0131m. Ayn\u0131 zamanda setAdapter metodu AdapterView class&#8217;\u0131n\u0131n abstract bir metodudur. Ayn\u0131 zamanda bu class ListView&#8217;in \u00fcst class&#8217;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&#8217;\u0131m\u0131z var ArrayAdapter class&#8217;\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&#8217;\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&#8217;\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&#8217;yu yormaktay\u0131z \u00e7\u00fcnk\u00fc inflater arac\u0131l\u0131\u011f\u0131 ile XML&#8217;den bir View objesi olu\u015fturmaya \u00e7al\u0131\u015f\u0131yoruz.. \u0130lk ba\u015fta <code>convertView<\/code> de\u011feri null olacakt\u0131r. E\u011fer null&#8217;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&#8217;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&#8217;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&#8217;ta yaz\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p>Daha sonras\u0131nda setTag ve getTag&#8217;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}]}}