22 Aralık 2021 Çarşamba

     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.









Hiç yorum yok:

Yorum Gönder