22 Aralık 2021 Çarşamba

 22.12.2021 Listeler ve Kodları

val numbers = listOf(0, 3, 8, 4, 0, 5, 5, 8, 9, 2) 
numbers isimli bir liste parantez içinde elemanları var. 
sorted kodu ile sıralayabiliriz. println("sorted: ${numbers.sorted()}")

val setOfNumbers = numbers.toSet() bu kod ile numbers listemizin içinde tekrarlayan sayıları 1 tane varmış gibi sayıyor. 

val peopleAges = mutableMapOf<String, Int>(
        "Fred" to 30,
        "Ann" to 23
    )
Bu kod bütünlüğünde mutable değiştirilebilir demek, map ise anahtar çifti olarak geçiyor, string int yüklemek şeklinde 2 adet değişkeni var
    Artık peopleAges listemizin içinde Fred=30 , Ann=23 kayıtları vardır. 

println(peopleAges)
Kodunun çıktı : {Fred=30, Ann=23} şeklinde olacaktır.

Aşağıda ki örneklerde de listeye ekleme yöntemleri vardır. 
peopleAges.put("Barbara", 42)
peopleAges["Joe"] = 51

peopleAges["Fred"] = 31 yaparsak Fred değişkeni yukarıda tanımladığımız için ekstra bir Fred koymayacaktır ama Fredin yaşını 30 dan 31'e güncelleyecektir.

peopleAges.forEach komutu ile peopleAges in içinde her değişkeni sırayla döndürebiliriz. 

peopleAges.forEach { print("${it.key} is ${it.value}, ") } Kodunun çıktısı : 
Fred is 31, Ann is 23, Barbara is 42, Joe is 51, olarak gözükecektir en sonda ki virgülde gözükecek ve kötü bir görüntü oluşturacaktır. 

Virgülden kurtulmak için kodu böyle güncellememiz gerekmektedir
println(peopleAges.map { "${it.key} is ${it.value}" }.joinToString(", ") ) Bu kodun çıktısı:
Fred is 31, Ann is 23, Barbara is 42, Joe is 51   ve artık sonunda virgül yoktur. 



Filter kodu ile listemizde filtremeler yapabiliriz örnek verirsek
val filteredNames = peopleAges.filter { it.key.length < 4 } 
Yukarıda ki kodda peopleAges listemizin içinde uzunluğu 4 den kısa olan isimleri(key demiş çünkü) filteredNames değişkenine tanımlıyor. 

println(filteredNames) yaparsak eğer : {Ann=23, Joe=51} çıktısını elde edeceğiz. 

Lambda kullanımı ->

val triple: (Int) -> Int = { it * 3 } isimde değişken tanımlarsak triple i çağırdığımızda ve bir int değer verdiğimizde o değeri 3 ile çarpacaktır

triple(3) yaparsak println(triple) çıktısı 9 olacaktır.

val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) } kodu ile ise b ile başlayan kelimeleri filteredWords e tanımlıyor

     21.12.2021 Fragmentlar Arası Geçiş ve RecyclerView Oluşumu


    İlk baş fragmentların kontrolü için res -> klasörünün altına navigation açıldı, sağ tık - > new -> resource file ekleyerek bir navigation graph eklendi, artık fragmentlarımızı buradan yönetebiliriz. 2 Adet fragment oluşturuldu HomeFragment ve SecondFragment, HomeFragment a bir adet buton eklendi gravitysi center yapıldı. SecondFragment'a ise recyclerview eklendi. home_fragment.xml dosyamıza navhostfragment koyup width ve height ini verdik  ve Navigation Graph dosyamızı açtık ve HomeFragment ve SecondFragment burada seçildi. HomeFragment home sayfası seçildi ve HomeFragmenttan, SecondFragmenta action oluşturuldu. Fragmentlar ile işimiz şimdilik bitti gelelim recyclerview için model, data ve adapter classlarının oluşturulmasına. Modelden başlarsak model klasörü oluşturduk ve içine Manzara isminde class açtık. Bu class data olmak zorunda çünkü recyclerview in içine aktaracağımız şeylerin türünü yazacağız(int, String vb.). Bizim recyclerview imiz bir adet Image ve altında bir adet Text olacak şekilde olacağı için model classımız ->

 data class Manzara(val stringResource: Int, val imageResourceId: Int)

    Şeklinde yaparak iki adet değişken tanımlandı ve bu classta işimiz bitti. Şimdi burada modelimizde kullanılacak şeyleri yazdık bunu xml dosyasında da belirmeliyiz. layout klasöründe bir tane xml dosyası açıyoruz ismi manzara_list.xml olsun içinde bir adet Imageview, bir adet textview koyuyoruz id leri, boyutlarını ayarlıyoruz. Ben düzgün bir görünüm için MaterialCardView yaptım ana kodu altına bir adet linearlayout oluşturdum ve bunların içine imageview ile textview i koydum. 


     Modelimiz ve ekranda dataların nasıl görüneceğini belirledik artık verilerimizi tanımlamalıyız. Data package ini oluşturdum ve bu klasörün içine Datasource diye bir class açtım. Bu class ın içine bir fonksiyon açtım. fun loadManzara(): List<Manzara> şeklinde  bunun içine verilerimizi gireceğiz. Manzara classında da belirttiğimiz gibi verilerimiz 1 adet textview ve 1 adet imageview den oluşacak. Textlerimi string.xml dosyası içine tanımlamadım. Imagelerimi ise drawable klasörünün içine attım. Artık bunları tanımlamak kaldı.

    Şu şekilde tanımladık. Şu süreden sonra adapter classımızı oluşturup verilerimizi recyclerview e ulaştıracağız ve recyclerview imizin olduğu homefragment sayfamızda recyclerview i tanımlayıp adapterden gelen kodları çekeceğiz. 
    Adapter package klasörümüzü oluşturduktan sonra ManzaraAdapter diye bir class açtık classımızın parantez içinde context ve List<Manzara> (Verilerimizin olduğu dizi) çektik ve yanına RecyclerView.Adapter<ManzaraAdapter.ManzaraViewHolder>() kodumuzu yazdık bu kısımda ManzaraViewHolder kırmızı yanacak ve program böyle bir class ın olmadığını söyleyecek. hemen kod bölümünün altına ManzaraViewHolder class ı açılarak View'ımız tanımlanacak. Bu class ın içinde view dende anlaşılacağı üstüne string ve image tanımlanacak 
tanımladıktan sonra ilk classımız ManzaraAdapter olan kızaracak ve bize onCreateViewHolder, onBindViewHolder ve getItemCount implete etmemizi isteyecek. onCreateViewHolder da hangi xml dosyasının referans alınacağı seçilecek. onBindViewHolder da referans alınan bu xml nin içinde ki text ve image verileri yerleştirilmesi olacak. getItemCount da ise recyclerview mizin uzunluğunu dizinin uzunluğuna eşitleyeceğiz.


    Adapter classımızın son hali böyle olacak ve bu sayfa ile işimiz bitecek. Şuan sadece recyclerview activity veya fragmentta bu bilgiyi adapter sayesinde çekmek kaldı. SecondFragmentta yani recyclerview in olduğu bölümde ki kod böyle

val myDataSet = Datasource().loadManzara()
val recyclerView = requireView().findViewById<RecyclerView>(R.id.recyclerview)
recyclerView.adapter = ManzaraAdapter(requireContext(),myDataSet)
recyclerView.setHasFixedSize(true)
}

yukarıda ki kod bütünlüğü ile datamız myDataSet e recyclerview imiz ise recyclerView değişkenlerine tanımlatıldı. Adapter kullanırak ManzaraAdapter classımızın içinde ki veri çekildi. 
 Home Fragmenta gidip butona tıklatıldığında secondfragmenta gidecek kodlar yazıldı.
btngecis = requireActivity().findViewById(R.id.btn_secondfragment)

btngecis.setOnClickListener {
findNavController().navigate(R.id.action_homeFragment_to_recyclerViewFragment)
}

Artık uygulamamız çalışmaktadır. Fragmentlar üzerinden yaptığım için kodlar onViewCreated bölümüne yazılmıştır yoksa hata vermekte.