{"id":39039,"date":"2026-02-13T03:40:56","date_gmt":"2026-02-13T00:40:56","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39039"},"modified":"2026-02-13T03:40:56","modified_gmt":"2026-02-13T00:40:56","slug":"android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/","title":{"rendered":"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi<\/h2>\n<p>Android uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini zenginle\u015ftirmenin ve veri giri\u015fini kolayla\u015ft\u0131rman\u0131n en etkili yollar\u0131ndan biri, otomatik tamamlama \u00f6zellikli metin giri\u015f alanlar\u0131 sunmakt\u0131r. Bu t\u00fcr alanlar, kullan\u0131c\u0131 bir \u015feyler yazmaya ba\u015flad\u0131\u011f\u0131nda ilgili \u00f6nerileri g\u00f6stererek hem zaman kazand\u0131r\u0131r hem de olas\u0131 yaz\u0131m hatalar\u0131n\u0131 azalt\u0131r. Android SDK, bu ihtiyac\u0131 kar\u015f\u0131lamak \u00fczere <code>AutoCompleteTextView<\/code> bile\u015fenini sunar. Bu kapsaml\u0131 rehberde, <code>AutoCompleteTextView<\/code>&#8216;in temel kullan\u0131m\u0131ndan geli\u015fmi\u015f \u00f6zelle\u015ftirmelere, asenkron veri y\u00fcklemeden \u00e7oklu se\u00e7im senaryolar\u0131na kadar her y\u00f6n\u00fcn\u00fc detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>AutoCompleteTextView Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p><code>AutoCompleteTextView<\/code>, <code>EditText<\/code> s\u0131n\u0131f\u0131ndan t\u00fcretilmi\u015f \u00f6zel bir metin giri\u015f bile\u015fenidir. Temel fark\u0131, kullan\u0131c\u0131n\u0131n yazmaya ba\u015flad\u0131\u011f\u0131 metne g\u00f6re bir dizi \u00f6neri sunabilmesidir. Bu \u00f6neriler, bir a\u00e7\u0131l\u0131r listede (dropdown) g\u00f6sterilir ve kullan\u0131c\u0131 bu listeden bir \u00f6\u011fe se\u00e7erek metin kutusunu kolayca doldurabilir.<\/p>\n<p><strong>Kullan\u0131m Alanlar\u0131:<\/strong><\/p>\n<p>*   <strong>Arama \u00c7ubuklar\u0131:<\/strong> Uygulama i\u00e7i i\u00e7eriklerde veya internet \u00fczerinde arama yaparken kullan\u0131c\u0131n\u0131n arama terimlerini tamamlamak.<br \/>\n*   <strong>Form Doldurma:<\/strong> \u00dclke, \u015fehir, eyalet gibi standart veri setlerinden se\u00e7im yapmay\u0131 gerektiren form alanlar\u0131.<br \/>\n*   <strong>Etiketleme\/Kategorilendirme:<\/strong> Bir \u00f6\u011feye etiket eklerken mevcut etiketleri \u00f6nermek.<br \/>\n*   <strong>Kullan\u0131c\u0131 Ad\u0131\/E-posta Giri\u015fi:<\/strong> Daha \u00f6nce girilmi\u015f veya kaydedilmi\u015f kullan\u0131c\u0131 adlar\u0131n\u0131\/e-postalar\u0131 \u00f6nermek.<br \/>\n*   <strong>Dinamik Veri Giri\u015fi:<\/strong> API&#8217;lerden veya veritabanlar\u0131ndan \u00e7ekilen dinamik verileri kullan\u0131c\u0131ya sunmak.<\/p>\n<p><code>AutoCompleteTextView<\/code> kullanarak, uygulaman\u0131z\u0131n daha sezgisel, h\u0131zl\u0131 ve hatas\u0131z bir kullan\u0131c\u0131 deneyimi sunmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h3>Temel Yap\u0131 ve Bile\u015fenler<\/h3>\n<p><code>AutoCompleteTextView<\/code>&#8216;i etkili bir \u015fekilde kullanabilmek i\u00e7in baz\u0131 temel bile\u015fenleri ve kavramlar\u0131 anlamak \u00f6nemlidir:<\/p>\n<h4>AutoCompleteTextView Bile\u015feni<\/h4>\n<p>Bu, XML layout dosyan\u0131zda tan\u0131mlad\u0131\u011f\u0131n\u0131z ve kullan\u0131c\u0131n\u0131n metin girdi\u011fi ana bile\u015fendir. \u00d6nerileri g\u00f6stermek i\u00e7in bir <code>Adapter<\/code>&#8216;a ihtiya\u00e7 duyar.<\/p>\n<h4>Adapter Kavram\u0131<\/h4>\n<p>Android&#8217;deki bir\u00e7ok liste tabanl\u0131 g\u00f6r\u00fcn\u00fcm (ListView, RecyclerView, Spinner vb.) gibi, <code>AutoCompleteTextView<\/code> de \u00f6neri listesini doldurmak i\u00e7in bir <code>Adapter<\/code> kullan\u0131r. <code>Adapter<\/code>, veri kayna\u011f\u0131 ile g\u00f6r\u00fcn\u00fcm aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. <code>AutoCompleteTextView<\/code> i\u00e7in genellikle a\u015fa\u011f\u0131daki adapter t\u00fcrleri kullan\u0131l\u0131r:<\/p>\n<p>*   <strong><code>ArrayAdapter<T><\/code>:<\/strong> Basit String dizileri veya <code>List<T><\/code> gibi veri yap\u0131lar\u0131 i\u00e7in en yayg\u0131n ve basit adapter&#8217;d\u0131r. Verileri bir <code>TextView<\/code> i\u00e7inde g\u00f6sterir.<br \/>\n*   <strong><code>SimpleCursorAdapter<\/code>:<\/strong> Veritaban\u0131 sorgular\u0131ndan d\u00f6nen <code>Cursor<\/code> nesneleriyle \u00e7al\u0131\u015fmak i\u00e7in kullan\u0131l\u0131r. Verileri belirli s\u00fctunlardan al\u0131p belirli <code>TextView<\/code>&#8216;lara e\u015fler.<br \/>\n*   <strong><code>BaseAdapter<\/code> veya \u00d6zel Adapter&#8217;lar:<\/strong> Daha karma\u015f\u0131k veri yap\u0131lar\u0131 (\u00f6rne\u011fin, resim ve metin i\u00e7eren \u00f6\u011feler) veya \u00f6zel filtreleme mant\u0131\u011f\u0131 gerekti\u011finde kendi adapter&#8217;\u0131n\u0131z\u0131 <code>BaseAdapter<\/code>&#8216;dan t\u00fcreterek olu\u015fturabilirsiniz.<\/p>\n<h4>Veri Kaynaklar\u0131<\/h4>\n<p><code>AutoCompleteTextView<\/code>&#8216;e \u00f6neri olarak sunulacak veriler \u00e7e\u015fitli kaynaklardan gelebilir:<\/p>\n<p>*   <strong>String Dizileri\/Listeleri:<\/strong> Sabit ve k\u00fc\u00e7\u00fck veri setleri i\u00e7in idealdir.<br \/>\n*   <strong>Custom Nesneler:<\/strong> Daha karma\u015f\u0131k bilgiler i\u00e7eren (ID, isim, a\u00e7\u0131klama gibi) kendi tan\u0131mlad\u0131\u011f\u0131n\u0131z nesnelerin listeleri.<br \/>\n*   <strong>Veritabanlar\u0131:<\/strong> Uygulama i\u00e7i bir SQLite veritaban\u0131ndan \u00e7ekilen veriler.<br \/>\n*   <strong>Web Servisleri\/API&#8217;ler:<\/strong> Uzak sunuculardan dinamik olarak \u00e7ekilen veriler (\u00fclkeler, \u015fehirler, \u00fcr\u00fcnler vb.).<\/p>\n<h3>Basit Bir AutoCompleteTextView Uygulamas\u0131<\/h3>\n<p>\u015eimdi, <code>AutoCompleteTextView<\/code>&#8216;in nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamak i\u00e7in basit bir \u00f6rnekle ba\u015flayal\u0131m. Bu \u00f6rnekte, bir dizi \u00fclke ad\u0131n\u0131 kullan\u0131c\u0131ya otomatik tamamlama \u00f6nerileri olarak sunaca\u011f\u0131z.<\/p>\n<h4>1. Layout Dosyas\u0131 (activity_main.xml)<\/h4>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"16dp\"\n    tools:context=\".MainActivity\">\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"\u00dclke Ad\u0131 Giriniz:\"\n        android:textSize=\"18sp\"\n        android:layout_marginBottom=\"8dp\"\/>\n\n    <AutoCompleteTextView\n        android:id=\"@+id\/autoCompleteTextView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:hint=\"\u00d6r: T\u00fcrkiye\"\n        android:completionThreshold=\"1\" \/> <!-- Kullan\u0131c\u0131 1 karakter yazd\u0131\u011f\u0131nda \u00f6nerileri g\u00f6ster -->\n\n<\/LinearLayout><\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>android:id<\/code>: Bu bile\u015fene kod taraf\u0131nda eri\u015fmek i\u00e7in benzersiz bir kimlik.<br \/>\n*   <code>android:hint<\/code>: Metin kutusu bo\u015fken g\u00f6r\u00fcnen ipucu metni.<br \/>\n*   <code>android:completionThreshold<\/code>: Kullan\u0131c\u0131n\u0131n ka\u00e7 karakter yazd\u0131ktan sonra \u00f6nerilerin g\u00f6sterilmeye ba\u015flanaca\u011f\u0131n\u0131 belirler. Burada <code>1<\/code> olarak ayarland\u0131\u011f\u0131 i\u00e7in, kullan\u0131c\u0131 tek bir karakter yazd\u0131\u011f\u0131nda bile \u00f6neriler belirecektir.<\/p>\n<h4>2. Java\/Kotlin Kodu (MainActivity)<\/h4>\n<pre><code class=\"language-java\">\/\/ Java\npackage com.example.autocompletetutorial;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.widget.ArrayAdapter;\nimport android.widget.AutoCompleteTextView;\nimport android.widget.Toast;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private AutoCompleteTextView autoCompleteTextView;\n    private String[] countries = {\"T\u00fcrkiye\", \"Almanya\", \"Fransa\", \"\u0130spanya\", \"\u0130talya\",\n                                  \"\u0130ngiltere\", \"Amerika Birle\u015fik Devletleri\", \"Kanada\",\n                                  \"Meksika\", \"Brezilya\", \"Arjantin\", \"\u00c7in\", \"Japonya\",\n                                  \"Hindistan\", \"Avustralya\", \"Yeni Zelanda\", \"G\u00fcney Afrika\"};\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        autoCompleteTextView = findViewById(R.id.autoCompleteTextView);\n\n        \/\/ ArrayAdapter olu\u015fturma\n        \/\/ 1. parametre: Context\n        \/\/ 2. parametre: Her bir \u00f6neri \u00f6\u011fesinin layout'u (Android'in haz\u0131r layout'lar\u0131ndan biri)\n        \/\/ 3. parametre: Veri kayna\u011f\u0131\n        ArrayAdapter<String> adapter = new ArrayAdapter<>(\n                this,\n                android.R.layout.simple_dropdown_item_1line,\n                countries\n        );\n\n        \/\/ AutoCompleteTextView'e adapter'\u0131 atama\n        autoCompleteTextView.setAdapter(adapter);\n\n        \/\/ Opsiyonel: Kullan\u0131c\u0131 bir \u00f6\u011feyi se\u00e7ti\u011finde Toast mesaj\u0131 g\u00f6sterme\n        autoCompleteTextView.setOnItemClickListener((parent, view, position, id) -> {\n            String selectedCountry = (String) parent.getItemAtPosition(position);\n            Toast.makeText(MainActivity.this, \"Se\u00e7ilen \u00dclke: \" + selectedCountry, Toast.LENGTH_SHORT).show();\n        });\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\npackage com.example.autocompletetutorial\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.widget.ArrayAdapter\nimport android.widget.AutoCompleteTextView\nimport android.widget.Toast\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var autoCompleteTextView: AutoCompleteTextView\n    private val countries = arrayOf(\n        \"T\u00fcrkiye\", \"Almanya\", \"Fransa\", \"\u0130spanya\", \"\u0130talya\",\n        \"\u0130ngiltere\", \"Amerika Birle\u015fik Devletleri\", \"Kanada\",\n        \"Meksika\", \"Brezilya\", \"Arjantin\", \"\u00c7in\", \"Japonya\",\n        \"Hindistan\", \"Avustralya\", \"Yeni Zelanda\", \"G\u00fcney Afrika\"\n    )\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        autoCompleteTextView = findViewById(R.id.autoCompleteTextView)\n\n        \/\/ ArrayAdapter olu\u015fturma\n        \/\/ 1. parametre: Context\n        \/\/ 2. parametre: Her bir \u00f6neri \u00f6\u011fesinin layout'u (Android'in haz\u0131r layout'lar\u0131ndan biri)\n        \/\/ 3. parametre: Veri kayna\u011f\u0131\n        val adapter = ArrayAdapter(\n            this,\n            android.R.layout.simple_dropdown_item_1line,\n            countries\n        )\n\n        \/\/ AutoCompleteTextView'e adapter'\u0131 atama\n        autoCompleteTextView.setAdapter(adapter)\n\n        \/\/ Opsiyonel: Kullan\u0131c\u0131 bir \u00f6\u011feyi se\u00e7ti\u011finde Toast mesaj\u0131 g\u00f6sterme\n        autoCompleteTextView.setOnItemClickListener { parent, view, position, id ->\n            val selectedCountry = parent.getItemAtPosition(position) as String\n            Toast.makeText(this, \"Se\u00e7ilen \u00dclke: $selectedCountry\", Toast.LENGTH_SHORT).show()\n        }\n    }\n}<\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>ArrayAdapter<String><\/code>: <code>countries<\/code> dizisindeki <code>String<\/code> t\u00fcr\u00fcndeki verileri y\u00f6netmek i\u00e7in bir <code>ArrayAdapter<\/code> olu\u015fturduk.<br \/>\n*   <code>android.R.layout.simple_dropdown_item_1line<\/code>: Bu, Android&#8217;in sa\u011flad\u0131\u011f\u0131 basit bir layout dosyas\u0131d\u0131r. Her bir \u00f6neri \u00f6\u011fesini tek sat\u0131rl\u0131k bir metin olarak g\u00f6sterir. Kendi \u00f6zel layout&#8217;unuzu da kullanabilirsiniz (ilerleyen b\u00f6l\u00fcmlerde g\u00f6rece\u011fiz).<br \/>\n*   <code>setAdapter()<\/code>: Olu\u015fturdu\u011fumuz adapter&#8217;\u0131 <code>autoCompleteTextView<\/code>&#8216;e atayarak veri kayna\u011f\u0131n\u0131 ve g\u00f6r\u00fcn\u00fcm format\u0131n\u0131 tan\u0131mlad\u0131k.<br \/>\n*   <code>setOnItemClickListener()<\/code>: Kullan\u0131c\u0131 a\u00e7\u0131l\u0131r listeden bir \u00f6\u011feyi t\u0131klad\u0131\u011f\u0131nda tetiklenecek bir dinleyici ekledik. Bu dinleyici sayesinde se\u00e7ilen \u00f6\u011fenin de\u011ferine eri\u015febiliriz.<\/p>\n<p>Bu basit kurulum ile uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>AutoCompleteTextView<\/code>&#8216;e bir harf yazmaya ba\u015flad\u0131\u011f\u0131n\u0131zda ilgili \u00fclke adlar\u0131n\u0131n bir listesini g\u00f6receksiniz.<\/p>\n<h3>AutoCompleteTextView&#8217;i \u00d6zelle\u015ftirme<\/h3>\n<p><code>AutoCompleteTextView<\/code>, g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc ve davran\u0131\u015f\u0131n\u0131 \u00f6zelle\u015ftirmek i\u00e7in \u00e7e\u015fitli \u00f6zellikler sunar.<\/p>\n<h4>1. completionThreshold<\/h4>\n<p>Bu \u00f6zelli\u011fi daha \u00f6nce g\u00f6rd\u00fck, ancak \u00f6nemini vurgulamakta fayda var. <code>android:completionThreshold=\"N\"<\/code> de\u011feri, kullan\u0131c\u0131n\u0131n metin kutusuna <code>N<\/code> karakter yazd\u0131ktan sonra \u00f6nerilerin g\u00f6sterilmeye ba\u015flanaca\u011f\u0131n\u0131 belirtir. K\u00fc\u00e7\u00fck de\u011ferler (1 veya 2 gibi) genellikle kullan\u0131c\u0131 deneyimini iyile\u015ftirir, ancak \u00e7ok b\u00fcy\u00fck veri setleri i\u00e7in performans\u0131 etkileyebilir.<\/p>\n<h4>2. Hint Metni<\/h4>\n<p><code>android:hint=\"\u00d6r: T\u00fcrkiye\"<\/code> \u00f6zelli\u011fi, metin kutusu bo\u015fken kullan\u0131c\u0131ya ne t\u00fcr bir giri\u015f beklendi\u011fini g\u00f6steren gri metni ayarlar.<\/p>\n<h4>3. A\u00e7\u0131l\u0131r Liste (Dropdown) G\u00f6r\u00fcn\u00fcm\u00fcn\u00fc \u00d6zelle\u015ftirme<\/h4>\n<p>A\u00e7\u0131l\u0131r listenin kendisinin g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc kontrol eden baz\u0131 \u00f6zellikler:<\/p>\n<p>*   <code>android:dropDownWidth<\/code>: A\u00e7\u0131l\u0131r listenin geni\u015fli\u011fini belirler. <code>match_parent<\/code>, <code>wrap_content<\/code> veya belirli bir <code>dp<\/code> de\u011feri olabilir.<br \/>\n*   <code>android:dropDownAnchor<\/code>: A\u00e7\u0131l\u0131r listenin hangi g\u00f6r\u00fcn\u00fcm\u00fcn alt\u0131na demirlenece\u011fini belirler. Genellikle <code>AutoCompleteTextView<\/code>&#8216;in kendi ID&#8217;si verilir.<br \/>\n*   <code>android:dropDownVerticalOffset<\/code>: A\u00e7\u0131l\u0131r listenin demirleme g\u00f6r\u00fcn\u00fcm\u00fcnden dikey olarak ne kadar kayd\u0131r\u0131laca\u011f\u0131n\u0131 belirler.<br \/>\n*   <code>android:dropDownHorizontalOffset<\/code>: A\u00e7\u0131l\u0131r listenin demirleme g\u00f6r\u00fcn\u00fcm\u00fcnden yatay olarak ne kadar kayd\u0131r\u0131laca\u011f\u0131n\u0131 belirler.<br \/>\n*   <code>android:popupBackground<\/code>: A\u00e7\u0131l\u0131r listenin arka plan\u0131n\u0131 \u00f6zelle\u015ftirmek i\u00e7in bir renk veya drawable kayna\u011f\u0131 belirler.<\/p>\n<p>\u00d6rnek kullan\u0131m:<\/p>\n<pre><code class=\"language-xml\"><AutoCompleteTextView\n    android:id=\"@+id\/autoCompleteTextView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:hint=\"\u00d6r: T\u00fcrkiye\"\n    android:completionThreshold=\"1\"\n    android:dropDownWidth=\"match_parent\"\n    android:dropDownAnchor=\"@+id\/autoCompleteTextView\"\n    android:dropDownVerticalOffset=\"5dp\"\n    android:popupBackground=\"@android:color\/holo_blue_light\"\/><\/code><\/pre>\n<h4>4. A\u00e7\u0131l\u0131r Liste \u00d6\u011fe D\u00fczenini \u00d6zelle\u015ftirme (Custom Layout)<\/h4>\n<p><code>android.R.layout.simple_dropdown_item_1line<\/code> basit bir <code>TextView<\/code> kullan\u0131r. Ancak, \u00f6neri \u00f6\u011felerini daha zengin g\u00f6stermek isteyebilirsiniz (\u00f6rne\u011fin, bir resim ve iki sat\u0131r metin). Bunun i\u00e7in kendi \u00f6zel layout&#8217;unuzu ve bir \u00f6zel adapter&#8217;\u0131 kullanman\u0131z gerekir.<\/p>\n<h5>Ad\u0131m 1: \u00d6zel Liste \u00d6\u011fesi Layout&#8217;u Olu\u015fturma (list_item_autocomplete.xml)<\/h5>\n<p><code>res\/layout<\/code> klas\u00f6r\u00fcnde yeni bir XML dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:padding=\"8dp\"\n    android:gravity=\"center_vertical\">\n\n    <ImageView\n        android:id=\"@+id\/imageViewFlag\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:src=\"@drawable\/ic_flag_placeholder\"\/> <!-- Varsay\u0131lan bir bayrak ikonu -->\n\n    <TextView\n        android:id=\"@+id\/textViewCountryName\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"16sp\"\n        android:textColor=\"@android:color\/black\"\n        android:text=\"\u00dclke Ad\u0131\"\/>\n\n<\/LinearLayout><\/code><\/pre>\n<p>Bu \u00f6rnekte, her bir \u00f6neri \u00f6\u011fesi bir bayrak ikonu (<code>ImageView<\/code>) ve \u00fclke ad\u0131n\u0131 (<code>TextView<\/code>) i\u00e7erecektir. <code>ic_flag_placeholder<\/code> drawable&#8217;\u0131n\u0131 <code>res\/drawable<\/code> klas\u00f6r\u00fcn\u00fcze eklemeniz gerekebilir.<\/p>\n<h5>Ad\u0131m 2: \u00d6zel ArrayAdapter Olu\u015fturma (CustomCountryAdapter.java\/kt)<\/h5>\n<p>\u015eimdi, bu \u00f6zel layout&#8217;u kullanacak bir adapter olu\u015fturmal\u0131y\u0131z. Bu adapter, <code>ArrayAdapter<\/code>&#8216;dan t\u00fcretilebilir ve <code>getView<\/code> metodunu override ederek kendi layout&#8217;umuzu \u015fi\u015firebiliriz.<\/p>\n<pre><code class=\"language-java\">\/\/ Java\npackage com.example.autocompletetutorial;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ArrayAdapter;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport java.util.List;\n\npublic class CustomCountryAdapter extends ArrayAdapter<String> {\n\n    private List<String> countries;\n    private Context context;\n\n    public CustomCountryAdapter(@NonNull Context context, @NonNull List<String> countries) {\n        super(context, 0, countries);\n        this.context = context;\n        this.countries = countries;\n    }\n\n    @NonNull\n    @Override\n    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {\n        if (convertView == null) {\n            convertView = LayoutInflater.from(context).inflate(\n                    R.layout.list_item_autocomplete, parent, false);\n        }\n\n        ImageView imageViewFlag = convertView.findViewById(R.id.imageViewFlag);\n        TextView textViewCountryName = convertView.findViewById(R.id.textViewCountryName);\n\n        String countryName = getItem(position);\n\n        if (countryName != null) {\n            textViewCountryName.setText(countryName);\n            \/\/ Bayrak ikonunu dinamik olarak ayarlamak i\u00e7in bir mant\u0131k eklenebilir.\n            \/\/ \u00d6rne\u011fin, \u00fclke ad\u0131na g\u00f6re bir drawable kayna\u011f\u0131 bulma.\n            \/\/ \u015eimdilik varsay\u0131lan bir ikon kullan\u0131yoruz.\n            imageViewFlag.setImageResource(R.drawable.ic_flag_placeholder);\n        }\n\n        return convertView;\n    }\n\n    \/\/ AutoCompleteTextView'in filtreleme mekanizmas\u0131 i\u00e7in\n    \/\/ getItem() ve getCount() metodlar\u0131 ArrayAdapter taraf\u0131ndan zaten sa\u011flan\u0131r.\n    \/\/ Ancak daha karma\u015f\u0131k filtreleme i\u00e7in getFilter() metodunu override etmek gerekebilir.\n}<\/code><\/pre>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\npackage com.example.autocompletetutorial\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ArrayAdapter\nimport android.widget.ImageView\nimport android.widget.TextView\n\nclass CustomCountryAdapter(context: Context, private val countries: List<String>) :\n    ArrayAdapter<String>(context, 0, countries) {\n\n    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {\n        val view = convertView ?: LayoutInflater.from(context)\n            .inflate(R.layout.list_item_autocomplete, parent, false)\n\n        val imageViewFlag: ImageView = view.findViewById(R.id.imageViewFlag)\n        val textViewCountryName: TextView = view.findViewById(R.id.textViewCountryName)\n\n        val countryName = getItem(position)\n\n        countryName?.let {\n            textViewCountryName.text = it\n            \/\/ Bayrak ikonunu dinamik olarak ayarlamak i\u00e7in bir mant\u0131k eklenebilir.\n            \/\/ \u00d6rne\u011fin, \u00fclke ad\u0131na g\u00f6re bir drawable kayna\u011f\u0131 bulma.\n            \/\/ \u015eimdilik varsay\u0131lan bir ikon kullan\u0131yoruz.\n            imageViewFlag.setImageResource(R.drawable.ic_flag_placeholder)\n        }\n\n        return view\n    }\n}<\/code><\/pre>\n<h5>Ad\u0131m 3: MainActivity&#8217;de \u00d6zel Adapter&#8217;\u0131 Kullanma<\/h5>\n<p><code>MainActivity<\/code>&#8216;deki adapter olu\u015fturma k\u0131sm\u0131n\u0131 yeni \u00f6zel adapter&#8217;\u0131n\u0131zla de\u011fi\u015ftirin:<\/p>\n<pre><code class=\"language-java\">\/\/ Java\n\/\/ ...\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class MainActivity extends AppCompatActivity {\n    \/\/ ...\n    private List<String> countryList = Arrays.asList(countries); \/\/ String[]'i List'e d\u00f6n\u00fc\u015ft\u00fcrd\u00fck\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        autoCompleteTextView = findViewById(R.id.autoCompleteTextView);\n\n        \/\/ \u00d6zel ArrayAdapter'\u0131 kullanma\n        CustomCountryAdapter adapter = new CustomCountryAdapter(this, countryList);\n        autoCompleteTextView.setAdapter(adapter);\n\n        \/\/ ... onItemClickListener ayn\u0131 kal\u0131r ...\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\n\/\/ ...\nclass MainActivity : AppCompatActivity() {\n    \/\/ ...\n    private val countryList: List<String> = countries.toList() \/\/ Array'i List'e d\u00f6n\u00fc\u015ft\u00fcrd\u00fck\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        autoCompleteTextView = findViewById(R.id.autoCompleteTextView)\n\n        \/\/ \u00d6zel ArrayAdapter'\u0131 kullanma\n        val adapter = CustomCountryAdapter(this, countryList)\n        autoCompleteTextView.setAdapter(adapter)\n\n        \/\/ ... onItemClickListener ayn\u0131 kal\u0131r ...\n    }\n}<\/code><\/pre>\n<p>Art\u0131k <code>AutoCompleteTextView<\/code>&#8216;iniz, her bir \u00f6neri \u00f6\u011fesini \u00f6zel olarak tasarlad\u0131\u011f\u0131n\u0131z layout ile g\u00f6sterecektir.<\/p>\n<h3>Se\u00e7im ve Metin De\u011fi\u015fikliklerini Y\u00f6netme<\/h3>\n<p>Kullan\u0131c\u0131n\u0131n <code>AutoCompleteTextView<\/code> ile etkile\u015fimini y\u00f6netmek i\u00e7in iki ana dinleyici (listener) kullan\u0131l\u0131r:<\/p>\n<h4>1. OnItemClickListener<\/h4>\n<p>Bu dinleyici, kullan\u0131c\u0131 a\u00e7\u0131l\u0131r listeden bir \u00f6\u011feyi se\u00e7ti\u011finde tetiklenir. <code>AutoCompleteTextView<\/code>&#8216;e do\u011frudan atan\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ Java\nautoCompleteTextView.setOnItemClickListener((parent, view, position, id) -> {\n    String selectedItem = (String) parent.getItemAtPosition(position);\n    Toast.makeText(MainActivity.this, \"Se\u00e7ilen: \" + selectedItem, Toast.LENGTH_SHORT).show();\n    \/\/ Se\u00e7ilen \u00f6\u011fe ile ilgili i\u015flemleri burada yapabilirsiniz.\n});<\/code><\/pre>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\nautoCompleteTextView.setOnItemClickListener { parent, view, position, id ->\n    val selectedItem = parent.getItemAtPosition(position) as String\n    Toast.makeText(this, \"Se\u00e7ilen: $selectedItem\", Toast.LENGTH_SHORT).show()\n    \/\/ Se\u00e7ilen \u00f6\u011fe ile ilgili i\u015flemleri burada yapabilirsiniz.\n}<\/code><\/pre>\n<p><code>parent.getItemAtPosition(position)<\/code> metodu, se\u00e7ilen \u00f6\u011fenin veri objesini d\u00f6nd\u00fcr\u00fcr. Bu objeyi kendi veri tipinize (\u00f6rne\u011fin <code>String<\/code> veya \u00f6zel bir <code>Country<\/code> objesi) d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.<\/p>\n<h4>2. TextWatcher<\/h4>\n<p>Bu dinleyici, <code>AutoCompleteTextView<\/code>&#8216;deki metin her de\u011fi\u015fti\u011finde (kullan\u0131c\u0131 her karakter yazd\u0131\u011f\u0131nda veya sildi\u011finde) tetiklenir. \u00d6zellikle dinamik filtreleme, anl\u0131k do\u011frulama veya di\u011fer metin tabanl\u0131 i\u015flemler i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. <code>AutoCompleteTextView<\/code>&#8216;e <code>addTextChangedListener()<\/code> metodu ile eklenir.<\/p>\n<pre><code class=\"language-java\">\/\/ Java\nimport android.text.Editable;\nimport android.text.TextWatcher;\n\/\/ ...\n\nautoCompleteTextView.addTextChangedListener(new TextWatcher() {\n    @Override\n    public void beforeTextChanged(CharSequence s, int start, int count, int after) {\n        \/\/ Metin de\u011fi\u015fmeden \u00f6nce\n    }\n\n    @Override\n    public void onTextChanged(CharSequence s, int start, int before, int count) {\n        \/\/ Metin de\u011fi\u015fti\u011finde (her karakter giri\u015finde\/silini\u015finde)\n        \/\/ Burada s, o anki metin kutusundaki CharSequence'i temsil eder.\n        \/\/ E\u011fer adapter'\u0131n\u0131z\u0131n filtreleme mekanizmas\u0131n\u0131 manuel olarak tetiklemek isterseniz,\n        \/\/ adapter.getFilter().filter(s); \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz.\n    }\n\n    @Override\n    public void afterTextChanged(Editable s) {\n        \/\/ Metin de\u011fi\u015ftikten sonra\n        \/\/ s.toString() ile metnin son haline eri\u015febilirsiniz.\n    }\n});<\/code><\/pre>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\nimport android.text.Editable\nimport android.text.TextWatcher\n\/\/ ...\n\nautoCompleteTextView.addTextChangedListener(object : TextWatcher {\n    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {\n        \/\/ Metin de\u011fi\u015fmeden \u00f6nce\n    }\n\n    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {\n        \/\/ Metin de\u011fi\u015fti\u011finde (her karakter giri\u015finde\/silini\u015finde)\n        \/\/ Burada s, o anki metin kutusundaki CharSequence'i temsil eder.\n        \/\/ E\u011fer adapter'\u0131n\u0131z\u0131n filtreleme mekanizmas\u0131n\u0131 manuel olarak tetiklemek isterseniz,\n        \/\/ (adapter as? Filterable)?.filter?.filter(s) \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz.\n    }\n\n    override fun afterTextChanged(s: Editable?) {\n        \/\/ Metin de\u011fi\u015ftikten sonra\n        \/\/ s.toString() ile metnin son haline eri\u015febilirsiniz.\n    }\n})<\/code><\/pre>\n<p><code>ArrayAdapter<\/code> ve <code>CustomCountryAdapter<\/code> gibi s\u0131n\u0131flar, <code>Filterable<\/code> aray\u00fcz\u00fcn\u00fc zaten uygulad\u0131klar\u0131 i\u00e7in <code>onTextChanged<\/code> i\u00e7inde manuel olarak <code>filter()<\/code> metodunu \u00e7a\u011f\u0131rman\u0131za gerek kalmaz. <code>AutoCompleteTextView<\/code> otomatik olarak bu adapter&#8217;lar\u0131n filtreleme mekanizmas\u0131n\u0131 tetikler. Ancak, \u00e7ok \u00f6zel filtreleme gereksinimleriniz varsa <code>TextWatcher<\/code> i\u00e7inde kendi filtreleme mant\u0131\u011f\u0131n\u0131z\u0131 uygulayabilirsiniz.<\/p>\n<h3>Geli\u015fmi\u015f Senaryolar: Dinamik Veri Kaynaklar\u0131 ve Asenkron \u0130\u015flemler<\/h3>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda \u00f6neri verileri genellikle statik bir dizi yerine bir veritaban\u0131ndan veya bir web servisinden dinamik olarak \u00e7ekilir. Bu t\u00fcr durumlarda asenkron programlama ve performans y\u00f6netimi kritik \u00f6neme sahiptir.<\/p>\n<h4>Web Servisinden Veri \u00c7ekme<\/h4>\n<p>Bir web servisinden veri \u00e7ekmek, a\u011f istekleri i\u00e7erdi\u011fi i\u00e7in asenkron olmal\u0131d\u0131r. Aksi takdirde, ana UI i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 (main thread) bloke ederek uygulaman\u0131n donmas\u0131na neden olabilirsiniz. Modern Android geli\u015ftirme yakla\u015f\u0131mlar\u0131, <code>ViewModel<\/code>, <code>LiveData<\/code> ve Kotlin Coroutines&#8217;i bu t\u00fcr g\u00f6revler i\u00e7in \u00f6nermektedir.<\/p>\n<h5>1. Veri Modeli Olu\u015fturma<\/h5>\n<p>\u00d6ncelikle, web servisinden gelecek verileri temsil edecek bir veri s\u0131n\u0131f\u0131 (data class) tan\u0131mlayal\u0131m.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\n\/\/ data class Country (\u00f6rne\u011fin, bir API'den gelen veri i\u00e7in)\ndata class Country(val id: String, val name: String, val code: String)<\/code><\/pre>\n<h5>2. Custom Filterable Adapter Olu\u015fturma<\/h5>\n<p>Bu adapter, <code>Filterable<\/code> aray\u00fcz\u00fcn\u00fc uygulayacak ve <code>getFilter()<\/code> metodunu override ederek kendi filtreleme mant\u0131\u011f\u0131m\u0131z\u0131 sa\u011flayacakt\u0131r. Filtreleme i\u015flemi, web servisinden veri \u00e7ekme i\u015flemini tetikleyecektir.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\n\/\/ CustomFilterableAdapter.kt\nimport android.content.Context\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ArrayAdapter\nimport android.widget.Filter\nimport android.widget.Filterable\nimport android.widget.TextView\n\nclass CustomFilterableAdapter(\n    context: Context,\n    private val onFilter: (String) -> Unit \/\/ Filtreleme istendi\u011finde \u00e7a\u011fr\u0131lacak lambda\n) : ArrayAdapter<Country>(context, 0), Filterable {\n\n    private var currentSuggestions: List<Country> = emptyList()\n\n    fun setSuggestions(suggestions: List<Country>) {\n        currentSuggestions = suggestions\n        clear() \/\/ Mevcut \u00f6\u011feleri temizle\n        addAll(suggestions) \/\/ Yeni \u00f6nerileri ekle\n        notifyDataSetChanged() \/\/ Adapter'\u0131 g\u00fcncelle\n    }\n\n    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {\n        val view = convertView ?: LayoutInflater.from(context)\n            .inflate(android.R.layout.simple_dropdown_item_1line, parent, false)\n        val country = getItem(position)\n        (view as TextView).text = country?.name\n        return view\n    }\n\n    override fun getFilter(): Filter {\n        return object : Filter() {\n            override fun performFiltering(constraint: CharSequence?): FilterResults {\n                \/\/ Bu metot arka planda \u00e7al\u0131\u015f\u0131r.\n                \/\/ Constraint, kullan\u0131c\u0131n\u0131n yazd\u0131\u011f\u0131 metindir.\n                \/\/ Biz burada asenkron bir \u00e7a\u011fr\u0131 tetikleyece\u011fiz.\n                val query = constraint?.toString() ?: \"\"\n                onFilter(query) \/\/ ViewModel'a filtreleme iste\u011fini g\u00f6nder\n                return FilterResults().apply {\n                    values = currentSuggestions\n                    count = currentSuggestions.size\n                }\n            }\n\n            override fun publishResults(constraint: CharSequence?, results: FilterResults?) {\n                \/\/ Bu metot UI thread'de \u00e7al\u0131\u015f\u0131r.\n                \/\/ setSuggestions() metodu zaten notifyDataSetChanged() \u00e7a\u011fr\u0131s\u0131 yap\u0131yor,\n                \/\/ bu y\u00fczden burada ekstra bir \u015fey yapmaya gerek yok.\n            }\n\n            override fun convertResultToString(resultValue: Any?): CharSequence {\n                \/\/ Kullan\u0131c\u0131 listeden bir \u00f6\u011feyi se\u00e7ti\u011finde AutoCompleteTextView'e yaz\u0131lacak metin.\n                return (resultValue as? Country)?.name ?: \"\"\n            }\n        }\n    }\n}<\/code><\/pre>\n<h5>3. ViewModel ile Veri Y\u00f6netimi<\/h5>\n<p><code>ViewModel<\/code>, UI ile i\u015f mant\u0131\u011f\u0131n\u0131 ay\u0131rmak ve konfig\u00fcrasyon de\u011fi\u015fikliklerinde (ekran d\u00f6nd\u00fcrme gibi) verilerin kaybolmamas\u0131n\u0131 sa\u011flamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\n\/\/ SearchViewModel.kt\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\n\nclass SearchViewModel : ViewModel() {\n\n    private val _searchResults = MutableLiveData<List<Country>>()\n    val searchResults: LiveData<List<Country>> = _searchResults\n\n    private var searchJob: Job? = null\n\n    fun searchCountries(query: String) {\n        searchJob?.cancel() \/\/ \u00d6nceki arama i\u015fini iptal et\n\n        if (query.isBlank()) {\n            _searchResults.value = emptyList()\n            return\n        }\n\n        searchJob = viewModelScope.launch {\n            delay(300) \/\/ Debounce: Kullan\u0131c\u0131n\u0131n yazmay\u0131 bitirmesini bekle (300ms)\n            \/\/ Sim\u00fcle edilmi\u015f a\u011f iste\u011fi\n            val results = simulateApiCall(query)\n            _searchResults.value = results\n        }\n    }\n\n    private fun simulateApiCall(query: String): List<Country> {\n        \/\/ Ger\u00e7ek bir API \u00e7a\u011fr\u0131s\u0131 burada yap\u0131lmal\u0131 (Retrofit vb. ile)\n        \/\/ \u015eimdilik sabit bir veri setinden filtreleme yap\u0131yoruz.\n        val allCountries = listOf(\n            Country(\"TR\", \"T\u00fcrkiye\", \"TR\"),\n            Country(\"DE\", \"Almanya\", \"DE\"),\n            Country(\"FR\", \"Fransa\", \"FR\"),\n            Country(\"US\", \"Amerika Birle\u015fik Devletleri\", \"US\"),\n            Country(\"CA\", \"Kanada\", \"CA\"),\n            Country(\"JP\", \"Japonya\", \"JP\"),\n            Country(\"CN\", \"\u00c7in\", \"CN\"),\n            Country(\"IN\", \"Hindistan\", \"IN\"),\n            Country(\"AU\", \"Avustralya\", \"AU\")\n        )\n        return allCountries.filter {\n            it.name.contains(query, ignoreCase = true) ||\n            it.code.contains(query, ignoreCase = true)\n        }\n    }\n}<\/code><\/pre>\n<p><strong>Debounce Kavram\u0131:<\/strong> <code>delay(300)<\/code> sat\u0131r\u0131 bir &#8220;debounce&#8221; mekanizmas\u0131d\u0131r. Kullan\u0131c\u0131 her karakter yazd\u0131\u011f\u0131nda API \u00e7a\u011fr\u0131s\u0131 yapmak yerine, kullan\u0131c\u0131n\u0131n yazmay\u0131 bitirmesi i\u00e7in k\u0131sa bir s\u00fcre bekleriz. Bu, gereksiz a\u011f isteklerini \u00f6nleyerek performans\u0131 art\u0131r\u0131r ve sunucu y\u00fck\u00fcn\u00fc azalt\u0131r.<\/p>\n<h5>4. MainActivity&#8217;de ViewModel ve Adapter&#8217;\u0131 Ba\u011flama<\/h5>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\n\/\/ MainActivity.kt\npackage com.example.autocompletetutorial\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.widget.AutoCompleteTextView\nimport android.widget.Toast\nimport androidx.activity.viewModels\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var autoCompleteTextView: AutoCompleteTextView\n    private lateinit var countryAdapter: CustomFilterableAdapter\n    private val searchViewModel: SearchViewModel by viewModels() \/\/ ViewModel'\u0131 ba\u015flat\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        autoCompleteTextView = findViewById(R.id.autoCompleteTextView)\n\n        \/\/ Adapter'\u0131 ba\u015flat\u0131rken filtreleme i\u015fini ViewModel'a delege ediyoruz.\n        countryAdapter = CustomFilterableAdapter(this) { query ->\n            searchViewModel.searchCountries(query)\n        }\n        autoCompleteTextView.setAdapter(countryAdapter)\n        autoCompleteTextView.completionThreshold = 1\n\n        \/\/ ViewModel'daki searchResults LiveData's\u0131n\u0131 g\u00f6zlemle\n        searchViewModel.searchResults.observe(this) { countries ->\n            countryAdapter.setSuggestions(countries) \/\/ Yeni \u00f6nerileri adapter'a g\u00f6nder\n        }\n\n        autoCompleteTextView.setOnItemClickListener { parent, view, position, id ->\n            val selectedCountry = parent.getItemAtPosition(position) as Country\n            Toast.makeText(this, \"Se\u00e7ilen \u00dclke: ${selectedCountry.name}\", Toast.LENGTH_SHORT).show()\n        }\n    }\n}<\/code><\/pre>\n<p>Bu kurulum ile, kullan\u0131c\u0131 <code>AutoCompleteTextView<\/code>&#8216;e yazd\u0131\u011f\u0131nda:<br \/>\n1.  <code>CustomFilterableAdapter<\/code>&#8216;\u0131n <code>getFilter().performFiltering()<\/code> metodu tetiklenir.<br \/>\n2.  Bu metot, <code>searchViewModel.searchCountries()<\/code> \u00e7a\u011fr\u0131s\u0131 yaparak filtreleme iste\u011fini <code>ViewModel<\/code>&#8216;a iletir.<br \/>\n3.  <code>ViewModel<\/code>, bir <code>delay<\/code> ile debounce uygulad\u0131ktan sonra sim\u00fcle edilmi\u015f API \u00e7a\u011fr\u0131s\u0131n\u0131 yapar.<br \/>\n4.  API&#8217;den gelen sonu\u00e7lar <code>_searchResults<\/code> <code>MutableLiveData<\/code>&#8216;s\u0131na atan\u0131r.<br \/>\n5.  <code>MainActivity<\/code>, <code>searchResults<\/code>&#8216;\u0131 g\u00f6zlemledi\u011fi i\u00e7in, yeni veriler geldi\u011finde <code>countryAdapter.setSuggestions()<\/code> metodunu \u00e7a\u011f\u0131rarak UI&#8217;y\u0131 g\u00fcnceller.<\/p>\n<p>Bu yap\u0131, UI&#8217;\u0131n responsive kalmas\u0131n\u0131 sa\u011flar ve karma\u015f\u0131k veri ak\u0131\u015f\u0131n\u0131 y\u00f6netmek i\u00e7in modern Android mimarisini kullan\u0131r. Ger\u00e7ek bir API entegrasyonu i\u00e7in Retrofit, OkHttp gibi k\u00fct\u00fcphaneleri kullanabilirsiniz.<\/p>\n<h4>Veritaban\u0131ndan Veri \u00c7ekme (Room ile)<\/h4>\n<p>E\u011fer verileriniz yerel bir veritaban\u0131nda (\u00f6rne\u011fin Room) saklan\u0131yorsa, benzer bir asenkron yakla\u015f\u0131m izleyebilirsiniz. <code>ViewModel<\/code> ve <code>LiveData<\/code> yine merkezi rol oynar. Room&#8217;un DAO (Data Access Object) metotlar\u0131 genellikle <code>suspend<\/code> fonksiyonlar olarak tan\u0131mlan\u0131r ve Coroutines ile kolayca \u00e7a\u011fr\u0131labilir.<\/p>\n<p>\u00d6rnek olarak, <code>CountryDao<\/code>&#8216;nuzda \u015f\u00f6yle bir metot olabilir:<\/p>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\n@Query(\"SELECT * FROM countries WHERE name LIKE '%' || :query || '%' OR code LIKE '%' || :query || '%'\")\nsuspend fun searchCountries(query: String): List<CountryEntity><\/code><\/pre>\n<p><code>SearchViewModel<\/code> i\u00e7indeki <code>simulateApiCall<\/code> yerine bu DAO metodunu \u00e7a\u011f\u0131r\u0131rs\u0131n\u0131z.<\/p>\n<h3>MultiAutoCompleteTextView: \u00c7oklu Se\u00e7imler \u0130\u00e7in<\/h3>\n<p>Bazen kullan\u0131c\u0131lar\u0131n tek bir alana birden fazla \u00f6\u011fe girmesini isteyebilirsiniz (\u00f6rne\u011fin, bir e-posta uygulamas\u0131nda al\u0131c\u0131 listesi veya bir g\u00f6nderiye birden fazla etiket ekleme). <code>MultiAutoCompleteTextView<\/code> tam da bu senaryo i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>AutoCompleteTextView<\/code>&#8216;den t\u00fcretilmi\u015ftir ve bir <code>Tokenizer<\/code> kullanarak giri\u015f metnini ayr\u0131 &#8220;token&#8221;lara (belirte\u00e7lere) b\u00f6ler.<\/p>\n<h4>Kullan\u0131m<\/h4>\n<p>1.  <strong>Layout Dosyas\u0131:<\/strong> <code>AutoCompleteTextView<\/code> yerine <code>MultiAutoCompleteTextView<\/code> kullan\u0131n.<\/p>\n<pre><code class=\"language-xml\"><MultiAutoCompleteTextView\n        android:id=\"@+id\/multiAutoCompleteTextView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:hint=\"Al\u0131c\u0131lar\u0131 virg\u00fclle ay\u0131r\u0131n\"\n        android:completionThreshold=\"1\" \/><\/code><\/pre>\n<p>2.  <strong>Java\/Kotlin Kodu:<\/strong> Bir <code>Tokenizer<\/code> ataman\u0131z gerekir. En yayg\u0131n olan\u0131 <code>CommaTokenizer<\/code>&#8216;d\u0131r, metni virg\u00fcllerle ay\u0131r\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ Java\n    import android.widget.MultiAutoCompleteTextView;\n    \/\/ ...\n\n    MultiAutoCompleteTextView multiAutoCompleteTextView = findViewById(R.id.multiAutoCompleteTextView);\n    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, new String[]{\"ali@example.com\", \"veli@example.com\", \"ayse@example.com\"});\n    multiAutoCompleteTextView.setAdapter(adapter);\n    multiAutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());<\/code><\/pre>\n<pre><code class=\"language-kotlin\">\/\/ Kotlin\n    import android.widget.MultiAutoCompleteTextView\n    \/\/ ...\n\n    val multiAutoCompleteTextView: MultiAutoCompleteTextView = findViewById(R.id.multiAutoCompleteTextView)\n    val adapter = ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, arrayOf(\"ali@example.com\", \"veli@example.com\", \"ayse@example.com\"))\n    multiAutoCompleteTextView.setAdapter(adapter)\n    multiAutoCompleteTextView.setTokenizer(MultiAutoCompleteTextView.CommaTokenizer())<\/code><\/pre>\n<p>Kullan\u0131c\u0131 <code>MultiAutoCompleteTextView<\/code>&#8216;e &#8220;ali@example.com, v&#8221; yazd\u0131\u011f\u0131nda, &#8220;v&#8221; i\u00e7in \u00f6neriler g\u00f6sterilir ve se\u00e7ildi\u011finde &#8220;ali@example.com, veli@example.com,&#8221; \u015feklinde metin kutusuna eklenir.<\/p>\n<h3>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h3>\n<p><code>AutoCompleteTextView<\/code>&#8216;i kullan\u0131rken kullan\u0131c\u0131 deneyimini ve performans\u0131 optimize etmek i\u00e7in baz\u0131 \u00f6nemli noktalar:<\/p>\n<p>*   <strong>Performans (B\u00fcy\u00fck Veri Setleri ve A\u011f \u0130stekleri):<\/strong><br \/>\n    *   <strong>Debounce:<\/strong> \u00d6zellikle a\u011f istekleri yaparken, <code>TextWatcher<\/code> i\u00e7inde bir <code>delay<\/code> kullanarak kullan\u0131c\u0131n\u0131n yazmay\u0131 bitirmesini bekleyin. Bu, gereksiz istekleri ve sunucu y\u00fck\u00fcn\u00fc azalt\u0131r.<br \/>\n    *   <strong>Arka Plan \u0130\u015flemleri:<\/strong> A\u011f istekleri veya yo\u011fun veritaban\u0131 sorgular\u0131 gibi uzun s\u00fcren i\u015flemleri her zaman ana i\u015f par\u00e7ac\u0131\u011f\u0131 d\u0131\u015f\u0131nda (Coroutines, RxJava, <code>ViewModel<\/code> + <code>LiveData<\/code> gibi) ger\u00e7ekle\u015ftirin.<br \/>\n    *   <strong>Veri Boyutu:<\/strong> M\u00fcmk\u00fcnse, \u00f6neri listesini sunucu taraf\u0131nda filtreleyerek veya sayfalayarak istemciye g\u00f6nderilen veri miktar\u0131n\u0131 azalt\u0131n.<br \/>\n    *   <strong>Lazy Loading:<\/strong> T\u00fcm veri setini bir kerede y\u00fcklemek yerine, yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda veya kullan\u0131c\u0131 belirli bir e\u015fi\u011fi a\u015ft\u0131\u011f\u0131nda verileri y\u00fckleyin.<\/p>\n<p>*   <strong>Kullan\u0131c\u0131 Deneyimi (UX):<\/strong><br \/>\n    *   <strong><code>completionThreshold<\/code>:<\/strong> Makul bir de\u011fer se\u00e7in (genellikle 1 veya 2). \u00c7ok y\u00fcksek bir de\u011fer, kullan\u0131c\u0131n\u0131n otomatik tamamlama \u00f6zelli\u011finden faydalanmas\u0131n\u0131 engeller.<br \/>\n    *   <strong>Hint Metni:<\/strong> Kullan\u0131c\u0131ya ne t\u00fcr bir giri\u015f beklendi\u011fini a\u00e7\u0131k\u00e7a belirten bir ipucu metni (<code>android:hint<\/code>) kullan\u0131n.<br \/>\n    *   <strong>Bo\u015f Durum ve Hata Y\u00f6netimi:<\/strong> Arama sonu\u00e7lar\u0131 bulunamad\u0131\u011f\u0131nda veya bir a\u011f hatas\u0131 olu\u015ftu\u011funda kullan\u0131c\u0131ya bilgilendirici mesajlar g\u00f6sterin.<br \/>\n    *   <strong>Klavye Y\u00f6netimi:<\/strong> Kullan\u0131c\u0131 bir \u00f6\u011feyi se\u00e7ti\u011finde klavyeyi otomatik olarak kapatmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<br \/>\n    *   <strong>G\u00f6rsel Geri Bildirim:<\/strong> A\u011fdan veri y\u00fcklenirken bir <code>ProgressBar<\/code> veya benzeri bir y\u00fckleme g\u00f6stergesi sunarak kullan\u0131c\u0131ya i\u015flemin devam etti\u011fini belirtin.<br \/>\n    *   <strong>Dokunma Alan\u0131:<\/strong> A\u00e7\u0131l\u0131r listedeki \u00f6\u011felerin yeterince b\u00fcy\u00fck bir dokunma alan\u0131na sahip oldu\u011fundan emin olun.<\/p>\n<p>*   <strong>Eri\u015filebilirlik:<\/strong><br \/>\n    *   <code>contentDescription<\/code>: \u00d6nemli g\u00f6r\u00fcn\u00fcmler i\u00e7in eri\u015filebilirlik a\u00e7\u0131klamalar\u0131 sa\u011flay\u0131n.<br \/>\n    *   Klavye Navigasyonu: <code>AutoCompleteTextView<\/code>&#8216;in klavye ile gezinilebilir oldu\u011fundan emin olun.<\/p>\n<p>*   <strong>InputType:<\/strong> Do\u011fru klavye t\u00fcr\u00fcn\u00fc (<code>android:inputType<\/code>) ayarlayarak kullan\u0131c\u0131n\u0131n veri giri\u015fini kolayla\u015ft\u0131r\u0131n (\u00f6rne\u011fin, <code>textEmailAddress<\/code>, <code>textPersonName<\/code>, <code>textAutoComplete<\/code>).<\/p>\n<p>*   <strong>Bellek Y\u00f6netimi:<\/strong> \u00d6zellikle \u00f6zel adapter&#8217;lar kullan\u0131rken, <code>convertView<\/code>&#8216;i yeniden kullanarak ve <code>ViewHolder<\/code> desenini uygulayarak liste \u00f6\u011felerinin \u015fi\u015firilmesini ve g\u00f6r\u00fcn\u00fcm aramalar\u0131n\u0131 optimize edin.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p><code>AutoCompleteTextView<\/code>, Android uygulamalar\u0131nda kullan\u0131c\u0131 etkile\u015fimini ve veri giri\u015fini \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015ftiren g\u00fc\u00e7l\u00fc ve esnek bir bile\u015fendir. Bu rehberde, basit statik veri setlerinden dinamik web servis entegrasyonlar\u0131na, temel \u00f6zelle\u015ftirmelerden <code>MultiAutoCompleteTextView<\/code> gibi geli\u015fmi\u015f senaryolara kadar <code>AutoCompleteTextView<\/code>&#8216;in t\u00fcm y\u00f6nlerini ele ald\u0131k.<\/p>\n<p>Do\u011fru adapter&#8217;\u0131 se\u00e7erek, performans ipu\u00e7lar\u0131n\u0131 uygulayarak ve kullan\u0131c\u0131 deneyimini \u00f6n planda tutarak, uygulaman\u0131zda verimli ve kullan\u0131c\u0131 dostu otomatik tamamlama alanlar\u0131 olu\u015fturabilirsiniz. Unutmay\u0131n, modern Android geli\u015ftirme prensiplerini (ViewModel, LiveData, Coroutines) benimsemek, \u00f6zellikle asenkron veri kaynaklar\u0131yla \u00e7al\u0131\u015f\u0131rken kodunuzu daha temiz, s\u00fcrd\u00fcr\u00fclebilir ve hatas\u0131z hale getirecektir. Bu bilgileri kullanarak kendi uygulamalar\u0131n\u0131zda g\u00fc\u00e7l\u00fc otomatik tamamlama \u00f6zellikleri geli\u015ftirmeye haz\u0131rs\u0131n\u0131z!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi\nAndroid uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini zenginle\u015fti","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-39039","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi Android uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini zenginle\u015fti\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-13T00:40:56+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi\",\"datePublished\":\"2026-02-13T00:40:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/\"},\"wordCount\":2305,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/\",\"name\":\"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-13T00:40:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi","og_description":"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi Android uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini zenginle\u015fti","og_url":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-13T00:40:56+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi","datePublished":"2026-02-13T00:40:56+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/"},"wordCount":2305,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/","name":"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-13T00:40:56+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/android-autocompletetextview-gelismis-otomatik-tamamlama-alanlari-olusturma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android AutoCompleteTextView: Geli\u015fmi\u015f Otomatik Tamamlama Alanlar\u0131 Olu\u015fturma Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=39039"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39039\/revisions"}],"predecessor-version":[{"id":39040,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39039\/revisions\/39040"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}