13 Şubat 2021 Cumartesi

Android Kütüphane Sistemi Mobil Uygulaması - 5 (Anasayfa)

  Merhabalar. Android Kütüphane Sistemi Mobil Uygulaması yazı dizisinin beşinci yazısı ile yeniden sizlerleyim. Bu yazıda sisteme giriş yaptıktan sonra açılan anasayfadan yani dashboard ekranından bahsedeceğim.Tekrar belirtmekte fayda olacak, uygulamanın kodlarına buradan erişebilirsiniz.

  Bir önceki yazımda sol menüden de ulaşılabilir olan ve uygulama açıldığında bizi ilk karşılayan kısmın AnasayfaFragment olduğundan bahsetmiştim. İlk setlenen fragment'ın bu fragment olması aşağıda ki kod parçacığı ile olmaktadır.

            tempFragment = AnasayfaFragment();

     supportFragmentManager.beginTransaction()
.replace(R.id.fragmentNavTutucu,tempFragment).commit();


Burada önemle belirtmek gerekir ki yukarıda fragmentları manuel olarak yönetmek amelelik olmakla birlikte bu fragmentların navigation unu Jetpack kütüphanesi ile idare etmek hem kod açısından hem de transaction yönetimi açısından oldukça kolaylaştırılmıştır. İlerleyen zamanlarda kodun bu kısmında güncelleme yapıp sizlerle paylaşacağım.

AnasayfaFragment ın görünümü aşağıda ki gibidir.



Burada İstatistikler i gösterdiğim Piechart için MPAndroidChart ,yuvarlak resimler için ise CircularImageview kütüphanelerinden yararlandım. Bu kütüphaneleri kullanabilmeniz için build.gradle (Module:app) dosyasının dependencies kısmına aşağıda ki satırları eklemeniz gerekmektedir. 

          implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'

    implementation 'com.mikhaellopez:circularimageview:4.2.0'

Fragment kitap türleri ve son beş kitabı gösteren 2 Recyclerview ve en altta ise bir PieChart içermektedir. 

fragment_anasayfa.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/loginParent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/kitapTurlerDashboardLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:id="@+id/kitapturlerDashboardTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_marginLeft="13dp"
android:layout_marginTop="25dp"
android:fontFamily="@font/alegreya"
android:text="@string/dashKitapTurlerLabel"
android:textColor="@color/siyah"
android:textSize="20sp"
android:textStyle="bold" />
</RelativeLayout>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/dashKitapTurlerRw"
android:layout_marginTop="20dp"
android:layout_below="@id/kitapTurlerDashboardLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<RelativeLayout
android:id="@+id/sonEklenenKitaplarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/dashKitapTurlerRw">

<TextView
android:id="@+id/sonEklenenKitaplarTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_marginLeft="13dp"
android:layout_marginTop="25dp"
android:fontFamily="@font/alegreya"
android:text="@string/sonEklenenKitaplarLabel"
android:textColor="@color/siyah"
android:textSize="20sp"
android:textStyle="bold" />
</RelativeLayout>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/sonEklenenKitaplar"
android:layout_marginTop="20dp"
android:layout_below="@id/sonEklenenKitaplarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<RelativeLayout
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_below="@+id/sonEklenenKitaplar"
android:layout_height="wrap_content">
<TextView
android:id="@+id/istatistiklerTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_marginLeft="13dp"
android:layout_marginTop="25dp"
android:fontFamily="@font/alegreya"
android:text="@string/istatistiklerLabel"
android:textColor="@color/siyah"
android:textSize="20sp"
android:textStyle="bold" />

<com.github.mikephil.charting.charts.PieChart
android:id="@+id/pieChart"
android:layout_marginTop="25dp"
android:layout_width="match_parent"
android:layout_height="300dp" />

</RelativeLayout>
</LinearLayout>
</ScrollView>
</RelativeLayout>

Burada ki RecyclerView lar gösterim için birer adapter ve layout a sahiptir. İlk olarak fragment ın kodlarına bakalım. Zaten adapterların setlendiği yerde AnasayfaFragment ' da.

AnasayfaFragment.kt

class AnasayfaFragment:Fragment() {

private lateinit var anasayfaView:View;
private lateinit var sonEklenenKitaplar:RecyclerView;
private lateinit var pd: Dialog;
private lateinit var kitapService: IKitapIslemService;
private lateinit var kullaniciService:IKullaniciService;
private lateinit var dashKitapTurlerRw:RecyclerView;
private lateinit var kitapTurIstatistik:PieChart;
private lateinit var pieEntry:ArrayList<PieEntry>;

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
anasayfaView = inflater.inflate(R.layout.fragment_anasayfa,container,false);
initComponents();

return anasayfaView;
}

private fun initComponents() {
this.sonEklenenKitaplar = this.anasayfaView.findViewById(R.id.sonEklenenKitaplar) as RecyclerView;
kitapService = WebApiUtil.getKitapService(context!!);
kullaniciService = WebApiUtil.getKullaniciService();
this.dashKitapTurlerRw = this.anasayfaView.findViewById(R.id.dashKitapTurlerRw) as RecyclerView;
this.kitapTurIstatistik = this.anasayfaView.findViewById(R.id.pieChart) as PieChart;

activity!!.hizliErisimFabButton.visibility = View.VISIBLE;

val sonKitaplarLayout = LinearLayoutManager(context!!,LinearLayoutManager.HORIZONTAL, false);
sonEklenenKitaplar.setHasFixedSize(true);
sonEklenenKitaplar.layoutManager = sonKitaplarLayout;

val dashKitapturlerLayout = LinearLayoutManager(context!!,LinearLayoutManager.HORIZONTAL, false);
dashKitapTurlerRw.setHasFixedSize(true);
dashKitapTurlerRw.layoutManager = dashKitapturlerLayout;

pd = Dialog(activity!!);
val pdView: View = layoutInflater.inflate(R.layout.custom_progress_dialog,null);
pd.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT));
pd.setTitle(null);
pd.setContentView(pdView);
pd.setCancelable(false);

this.loadSon5Kitap();
this.loadKitapTurleri();
this.loadKitapTurIstatistikler();
}

private fun loadKitapTurleri(){
pd.show();
kullaniciService.getKitapturListe().enqueue(object:
Callback<ArrayList<IlgiAlanlariParametreModel>> {
override fun onFailure(call: Call<ArrayList<IlgiAlanlariParametreModel>>?, t: Throwable) {
SimpleToast.error(activity!!.applicationContext, resources.getString(R.string.kitapTurListeHata), "{fa-times-circle}");
pd.dismiss();
}

override fun onResponse(call: Call<ArrayList<IlgiAlanlariParametreModel>>?, response: Response<ArrayList<IlgiAlanlariParametreModel>>) {
val ilgiAlanlariListe = response.body() as ArrayList<IlgiAlanlariParametreModel>;
val adapter = DashKitapturAdapter(activity!!.applicationContext,ilgiAlanlariListe);
dashKitapTurlerRw.adapter = adapter;
pd.dismiss();
}
});
}

private fun loadSon5Kitap(){
pd.show();
val jsonObj: JSONObject = JSONObject();
jsonObj.put("minKayitNum",0);
jsonObj.put("maxKayitNum",5);
kitapService.getKitapListe(jsonObj.toString()).enqueue(object:
Callback<ArrayList<KitapModel>> {
override fun onFailure(call: Call<ArrayList<KitapModel>>?, t: Throwable) {
Log.d("Exception",""+t.localizedMessage);
SimpleToast.error(context, resources.getString(R.string.kitapListeHata), "{fa-times-circle}");
pd.dismiss();
}

override fun onResponse(call: Call<ArrayList<KitapModel>>?, response: Response<ArrayList<KitapModel>>) {
val liste = response.body() as ArrayList<KitapModel>;
val kitapAdapter:DashKitapAdapter = DashKitapAdapter(context!!,liste);
sonEklenenKitaplar.adapter = kitapAdapter;
pd.dismiss();
}
});
}

private fun loadKitapTurIstatistikler(){
kitapService.getKitapTurIstatistikListe().enqueue(object:
Callback<ArrayList<KitapTurIstatistikModel>> {
override fun onFailure(call: Call<ArrayList<KitapTurIstatistikModel>>?, t: Throwable) {
Log.d("Exception",""+t.localizedMessage);
SimpleToast.error(context, resources.getString(R.string.kitapListeHata), "{fa-times-circle}");
pd.dismiss();
}

override fun onResponse(call: Call<ArrayList<KitapTurIstatistikModel>>?, response: Response<ArrayList<KitapTurIstatistikModel>>) {
val liste = response.body() as ArrayList<KitapTurIstatistikModel>;
pieEntry = ArrayList<PieEntry>();
val colorListe = mutableListOf<Int>()
for (l in liste){
pieEntry.add(PieEntry(l.adet!!.toFloat(),l.aciklama));
colorListe.add(ProjectUtil.generateRandomColorCode());
}
val dataSet = PieDataSet(pieEntry, "");
val data = PieData(dataSet);
dataSet.colors = colorListe;
pieChart.data = data;
pieChart.description.text = "";
pieChart.isDrawHoleEnabled = false;
pieChart.invalidate();
data.setValueTextSize(13f);

pd.dismiss();
}
});
}
}

Yukarıda bahsettiğim 2 Recyclerview ve PieChart init metodunda çağırılan aşağıda ki kodlar ile dolmaktadır.

        this.loadSon5Kitap();
this.loadKitapTurleri();
this.loadKitapTurIstatistikler();

Son kaydedilen 5 kitabı gösteren Recyclerview ın layout ve adapterları aşağıda ki gibidir.

dash_card_kitap.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ImageView
android:id="@+id/dashKitapCardImageId"
android:layout_width="160dp"
android:layout_height="200dp"
android:layout_marginTop="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/edit_text_border" />
</androidx.constraintlayout.widget.ConstraintLayout>

DashKitapAdapter.kt

class DashKitapAdapter(private val mContext: Context, private val kitapListe:ArrayList<KitapModel>):
RecyclerView.Adapter<DashKitapHolder>(){

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DashKitapHolder {
val dashKitapCardView: View = LayoutInflater.from(mContext).inflate(R.layout.dash_card_kitap,parent,false);
return DashKitapHolder(dashKitapCardView);
}

override fun getItemCount(): Int {
return kitapListe.size;
}

override fun onBindViewHolder(holder: DashKitapHolder, position: Int) {
val kitap:KitapModel = kitapListe.get(position);

Glide.with(mContext).load(kitap.kitapResimPath).into(holder.dashKitapImage);
holder.dashKitapImage.setOnClickListener {
putKitapDetayIntoSharedPreferences(mContext,kitap);
ProjectUtil.activityYonlendir(mContext, KitapDetayActivity());
}
}

private fun putKitapDetayIntoSharedPreferences(mContext: Context, kitap: KitapModel) {
kitap.id?.let {
ProjectUtil.putIntDataToSharedPreferences(mContext,ProjectUtil.SHARED_PREF_FILE,"kitapId",
it
)
};
ProjectUtil.putStringDataToSharedPreferences(mContext,ProjectUtil.SHARED_PREF_FILE,"kitapAd",kitap.kitapAd.toString());
ProjectUtil.putStringDataToSharedPreferences(mContext,ProjectUtil.SHARED_PREF_FILE,"yazarAd",kitap.yazarAd.toString());
ProjectUtil.putStringDataToSharedPreferences(mContext,ProjectUtil.SHARED_PREF_FILE,"kitapAciklama",kitap.kitapAciklama.toString());
ProjectUtil.putStringDataToSharedPreferences(mContext,ProjectUtil.SHARED_PREF_FILE,"kitapTur",kitap.kitapTur!!.aciklama.toString());
ProjectUtil.putStringDataToSharedPreferences(mContext,ProjectUtil.SHARED_PREF_FILE,"kitapYayinevi",kitap.yayinEvi!!.aciklama.toString());
ProjectUtil.putStringDataToSharedPreferences(mContext,ProjectUtil.SHARED_PREF_FILE,"kitapResim",kitap.kitapResimPath.toString());
kitap.alinmatarihi?.let { ProjectUtil.formatDate(it,"dd.MM.yyyy") }?.let {
ProjectUtil.putStringDataToSharedPreferences(mContext,ProjectUtil.SHARED_PREF_FILE,"kitapAlinmaTarih",
it
)
};
ProjectUtil.putDoubleDataToSharedPreferences(mContext,ProjectUtil.SHARED_PREF_FILE,"kitapPuan",kitap.kitapPuan);
}
}

Burada dikkat etmemiz gereken şey bu adapter ın setlendiği RecyclerView ' ın genelde kullanılan tarzdan farklı olarak dikey değil yatay durmasıdır. Bu da fragmentta ki aşağıda ki kod satırları ile oluyor.

    val sonKitaplarLayout = LinearLayoutManager(context!!,LinearLayoutManager.HORIZONTAL, false);
    sonEklenenKitaplar.setHasFixedSize(true);
    sonEklenenKitaplar.layoutManager = sonKitaplarLayout;

Kitap türlerini gösteren Recyclerview ın layout ve adapterları aşağıda ki gibidir.

card_dash_kitaptur.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<com.mikhaellopez.circularimageview.CircularImageView
android:id="@+id/dashKitapturImageViewId"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
app:civ_border_color="@color/imageShadow"
app:civ_border_width="1dp"
app:civ_shadow="true"
app:civ_shadow_color="@color/imageShadow"
app:civ_shadow_radius="2dp" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/dashKitapturTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_below="@id/dashKitapturImageViewId"
android:layout_centerInParent="true"
android:text="asddsa"
android:textSize="16sp"
android:textStyle="bold" />
</RelativeLayout>

DashKitapturAdapter.kt

class DashKitapturAdapter(private val mContext: Context, private val kitapTurListe:ArrayList<IlgiAlanlariParametreModel>):
RecyclerView.Adapter<DashKitapturHolder>(){

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DashKitapturHolder {
val dashKitapturlerCardView: View = LayoutInflater.from(mContext).inflate(R.layout.card_dash_kitaptur,parent,false);
return DashKitapturHolder(dashKitapturlerCardView);
}

override fun getItemCount(): Int {
return kitapTurListe.size;
}

override fun onBindViewHolder(holder: DashKitapturHolder, position: Int) {
val ilgiAlan:IlgiAlanlariParametreModel = kitapTurListe.get(position);
Glide.with(mContext).load(ilgiAlan.resim).into(holder.dashKitapturImage);
holder.dashKitapturText.text = ilgiAlan.aciklama;
}
}

Soru,istek ve önerilerinizi mesutemrecelenk@gmail.com adresine yazabilirsiniz. Bir sonraki yazıda görüşmek üzere hoşça kalın...

Hiç yorum yok:

Yorum Gönder