v2.5.2
Giriş yap

Favorilerden sildiğim ürün recyclerview'de tekrar gözüküyor?

eminkurt
165 defa görüntülendi
    
import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.card.MaterialCardView
import com.squareup.picasso.Picasso
import com.volkan.delishdish.Database.DbHelper
import com.volkan.delishdish.Database.FavouriteDBO
import com.volkan.delishdish.Fragments.CocktailDetaiFragment
import com.volkan.delishdish.Models.ModelCocktails
import com.volkan.delishdish.R
import com.volkan.delishdish.ViewModels.FavouriteViewModel

class FavouriteCocktailsAdapter(
    // FavouriteCocktailsAdapter sınıfını tanımlıyoruz ve RecyclerView.Adapter sınıfından kalıtım alıyoruz.
    private val mContext: Context, // mContext adında bir Context değişkeni tanımlıyoruz.
    private val cocktails_list: MutableList<ModelCocktails>,
    private val viewModel: FavouriteViewModel,// cocktails_list adında bir ModelCocktails listesi tanımlıyoruz.
) :
    RecyclerView.Adapter<FavouriteCocktailsAdapter.CardViewDesigner>() { // RecyclerView.Adapter sınıfından türetilmiş, CardViewDesigner iç sınıfını kullanıyoruz.

    @SuppressLint("NotifyDataSetChanged")
    inner class CardViewDesigner(view: View) :
        RecyclerView.ViewHolder(view) { // İç sınıf: CardViewDesigner, RecyclerView.ViewHolder sınıfından türetiliyor.
        var productCardView: MaterialCardView // MaterialCardView türünde productCardView değişkeni tanımlıyoruz.
        var productImageView: ImageView // ImageView türünde productImageView değişkeni tanımlıyoruz.
        var productImageViewDelete: ImageView // ImageView türünde productImageView değişkeni tanımlıyoruz.
        var productTextViewTitle: TextView // TextView türünde productTextViewTitle değişkeni tanımlıyoruz.
        var productTextViewTags: TextView // TextView türünde productTextViewTags değişkeni tanımlıyoruz.

        init { // İnitializer bloğu: CardViewDesigner sınıfının ilklenme aşamasında yapılacak işlemleri tanımlıyoruz.
            productCardView =
                view.findViewById(R.id.productCardView) // productCardView değişkenine R.id.productCardView id'sine sahip view'i bağlıyoruz.
            productImageView =
                view.findViewById(R.id.productImageView) // productImageView değişkenine R.id.productImageView id'sine sahip view'i bağlıyoruz.
            productImageViewDelete =
                view.findViewById(R.id.productImageViewDelete) // productImageViewDelete değişkenine R.id.productImageView id'sine sahip view'i bağlıyoruz.
            productTextViewTitle =
                view.findViewById(R.id.productTextViewTitle) // productTextViewTitle değişkenine R.id.productTextViewTitle id'sine sahip view'i bağlıyoruz.
            productTextViewTags =
                view.findViewById(R.id.productTextViewTags) // productTextViewTags değişkenine R.id.productTextViewTags id'sine sahip view'i bağlıyoruz.

            // Favori kokteyli silme işlevselliğini productImageViewDelete üzerinde tanımla
            /* productImageViewDelete.setOnClickListener {
                 val position = adapterPosition
                 val cocktail = cocktails_list[position]

                 // Favori kokteyli veritabanından sil
                 val dbHelper = DbHelper(mContext)
                 val favouriteDBO = FavouriteDBO()
                 favouriteDBO.deleteFavouriteCocktail(dbHelper, cocktail.idDrink)

                 // Silinen kokteyl öğesini listeden kaldır ve güncelle
                 cocktails_list.removeAt(position)
                 notifyItemRemoved(position)

                 // Favori kokteyli silme işlevselliğini gerçekleştir
                 viewModel.removeFavouriteCocktail(dbHelper, favouriteDBO, cocktail.idDrink)

                 Toast.makeText(mContext, "Favori kokteyl silindi", Toast.LENGTH_SHORT).show()
             }*/

        }
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): CardViewDesigner { // onCreateViewHolder fonksiyonu, ViewHolder nesnesi oluşturmak için kullanılır.
        val design = // LayoutInflater kullanarak XML layout dosyasını view'a dönüştürüyoruz.
            LayoutInflater.from(mContext)
                .inflate(R.layout.product_favourites_card_view, parent, false)
        return CardViewDesigner(design) // CardViewDesigner sınıfından bir nesne oluşturup döndürüyoruz.
    }

    override fun getItemCount(): Int { // getItemCount fonksiyonu, adapterin içinde tutulan veri listesinin boyutunu döndürür.
        return cocktails_list.size // cocktails_list'in boyutunu döndürüyoruz.
    }

    @SuppressLint("NotifyDataSetChanged")
    override fun onBindViewHolder(
        holder: CardViewDesigner,
        position: Int
    ) { // onBindViewHolder fonksiyonu, belirli bir pozisyondaki öğeyi görüntülemek için kullanılır.
        val cocktails =
            cocktails_list[position] // cocktails_list'ten belirli bir pozisyondaki öğeyi alıyoruz.
        holder.productTextViewTitle.text =
            cocktails.strDrink // holder içindeki productTextViewTitle'e içeceğin adını yazıyoruz.
        holder.productTextViewTags.text =
            cocktails.strTags // holder içindeki productTextViewTags'e içeceğin etiketlerini yazıyoruz.

        Picasso.get().load(cocktails.strDrinkThumb)
            .into(holder.productImageView) // Picasso kütüphanesiyle içeceğin resmini ImageView'e yüklüyoruz.

        holder.productImageViewDelete.setOnClickListener {
            val cocktail = cocktails_list[position]

            val dbHelper = DbHelper(mContext)
            val favouriteDBO = FavouriteDBO()
            favouriteDBO.deleteFavouriteCocktail(dbHelper, cocktail.idDrink)

            cocktails_list.removeAt(position)
            notifyItemRemoved(position)

            // ViewModel'den ilgili işlevi çağır

            Toast.makeText(mContext, "Favori kokteyl silindi", Toast.LENGTH_SHORT).show()
        }

        holder.productCardView.setOnClickListener { // Ürün kartına tıklandığında gerçekleşecek işlemleri belirtiyoruz.
            val fragment =
                CocktailDetaiFragment() // Yeni bir CocktailDetaiFragment nesnesi oluşturuyoruz.
            val args = Bundle() // Yeni bir Bundle nesnesi oluşturuyoruz.
            args.putString("cocktailId", cocktails.idDrink) // Bundle'a içeceğin ID'sini ekliyoruz.
            fragment.arguments = args // Fragment'a argümanları ekliyoruz.

            (mContext as AppCompatActivity).supportFragmentManager.beginTransaction() // Fragment işlemleri için bir Transaction başlatıyoruz.
                .replace(
                    R.id.navHostFragment,
                    fragment
                ) // NavHostFragment'ı yeni fragment ile değiştiriyoruz.
                .addToBackStack(null) // Geri al tuşu basıldığında fragment'i geri alabilmek için geri alınabilir kuyruğa ekliyoruz.
                .commit() // İşlemi tamamlıyoruz.
        }
    }

    fun updateList(newItems: List<ModelCocktails>) {
        // Mevcut içeriği temizle
        cocktails_list.clear()
        // Yeni öğeleri mevcut listeye ekle
        cocktails_list.addAll(newItems)
        // Veri değişikliğini adaptöre bildir
        notifyDataSetChanged()
    }

}
    

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.volkan.delishdish.Adapters.FavouriteCocktailsAdapter
import com.volkan.delishdish.Adapters.FavouriteMealsAdapter
import com.volkan.delishdish.Database.DbHelper
import com.volkan.delishdish.Database.FavouriteDBO
import com.volkan.delishdish.ViewModels.FavouriteViewModel
import com.volkan.delishdish.databinding.FragmentFavoritesBinding


// Fragment sınıfından türetilen Favoriler Fragment sınıfının tanımlanması
class FavoritesFragment : Fragment() {

    // Görünüm ve SharedPreferencesManager değişkenlerinin tanımlanması
    private lateinit var binding: FragmentFavoritesBinding

    // ViewModel değişkeninin tanımlanması
    private val viewModel: FavouriteViewModel by viewModels()

    // Favori yemekler ve kokteyller için adaptör değişkenlerinin tanımlanması
    private lateinit var favouriteMealsAdapter: FavouriteMealsAdapter
    private lateinit var favouriteCocktailsAdapter: FavouriteCocktailsAdapter

    // Favori veri erişim nesnesi ve veritabanı yardımcı sınıfı değişkenlerinin tanımlanması
    private val favouriteDBO = FavouriteDBO()
    private lateinit var dbHelper: DbHelper


    // Fragment oluşturulduğunda çağrılan metot
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        // Bağlamın oluşturulması ve ayarlanması
        binding = FragmentFavoritesBinding.inflate(inflater, container, false)

        // Veritabanı yardımcı sınıfının başlatılması
        dbHelper = DbHelper(requireContext())

        // RecyclerView düzen yöneticisinin ve adaptörlerin ayarlanması
        binding.favouriteMealsListRV.layoutManager =
            LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
        binding.favouriteCocktailsListRV.layoutManager =
            LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

        favouriteMealsAdapter = FavouriteMealsAdapter(requireContext(), mutableListOf())
        binding.favouriteMealsListRV.adapter = favouriteMealsAdapter

        favouriteCocktailsAdapter =
            FavouriteCocktailsAdapter(requireContext(), mutableListOf(), viewModel)
        binding.favouriteCocktailsListRV.adapter = favouriteCocktailsAdapter

        // ViewModel'i gözlemlemek için yardımcı metotun çağrılması
        observeViewModel()

        // Favori yemekler ve kokteyllerin alınması
        viewModel.getFavouriteMeals(dbHelper)
        viewModel.getFavouriteCocktails(dbHelper)

        /*   val fragment = FavoritesFragment()
           val transaction = requireActivity().supportFragmentManager.beginTransaction()
           transaction.replace(R.id.navHostFragment, fragment, "reminder")
           transaction.commit()*/

        /*val fragment = FavoritesFragment()
        val transaction = requireActivity().supportFragmentManager.beginTransaction()
        transaction.replace(R.id.navHostFragment, fragment, "favoritesFragment")
        transaction.commit()*/


        // Oluşturulan görünümün döndürülmesi
        return binding.root
    }

    // ViewModel'i gözlemlemek için yardımcı metot
    private fun observeViewModel() {
        // Favori yemeklerin LiveData'sının gözlemlenmesi ve adaptörün güncellenmesi
        viewModel.favouriteMeals.observe(viewLifecycleOwner) { meals ->
            meals?.let {
                favouriteMealsAdapter.updateList(it)
            }
        }

        // Favori kokteyllerin LiveData'sının gözlemlenmesi ve adaptörün güncellenmesi
        viewModel.favouriteCocktails.observe(viewLifecycleOwner) { cocktails ->
            cocktails?.let {
                favouriteCocktailsAdapter.updateList(it)
            }
        }

        // Hata mesajının LiveData'sının gözlemlenmesi ve gösterilmesi
        viewModel.error.observe(viewLifecycleOwner) { errorMessage ->
            errorMessage?.let {
                Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
            }
        }
    }

}

    
import android.annotation.SuppressLint
import android.content.ContentValues
import android.util.Log
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import com.volkan.delishdish.Models.FavouriteModel
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity

class FavouriteDBO {

    // Favori yemek ekleme işlemini gerçekleştiren fonksiyon
    fun addFavourite(db: DbHelper, product_id: String) {
        val db_object = db.writableDatabase

        // Veritabanında, eklenmek istenen yemeğin zaten favorilere eklenip eklenmediğini kontrol etmek için bir sorgu hazırla
        val query = "SELECT * FROM favourite_meals WHERE product_id = ?"
        val cursor = db_object.rawQuery(query, arrayOf(product_id))

        // Eğer product ID zaten varsa, eklemeyi yapma
        if (cursor.count == 0) {
            val values = ContentValues()

            // Favori yemeğin üye kimliği ve ürün kimliğini ContentValues'e ekle
            values.put("product_id", product_id)

            // ContentValues'teki verileri "favourite_meals" tablosuna ekle
            db_object.insertOrThrow("favourite_meals", null, values)
        }

        cursor.close()
        db_object.close()
    }

    // Favori kokteyl ekleme işlemini gerçekleştiren fonksiyon
    fun addFavouriteCocktail(db: DbHelper, product_id: String) {
        val db_object = db.writableDatabase

        // Veritabanında, eklenmek istenen kokteylin zaten favorilere eklenip eklenmediğini kontrol etmek için bir sorgu hazırla
        val query = "SELECT * FROM favourite_cocktails WHERE product_id = ?"
        val cursor = db_object.rawQuery(query, arrayOf(product_id))

        // Eğer product ID zaten varsa, eklemeyi yapma
        if (cursor.count == 0) {
            val values = ContentValues()

            // Favori kokteylin üye kimliği ve ürün kimliğini ContentValues'e ekle
            values.put("product_id", product_id)

            // ContentValues'teki verileri "favourite_cocktails" tablosuna ekle
            db_object.insertOrThrow("favourite_cocktails", null, values)
        }

        cursor.close()
        db_object.close()
    }

    // Bir üyenin favori yemeklerini getiren fonksiyon
    @SuppressLint("Recycle")
    fun getFavourites(dbHelper: DbHelper): ArrayList<FavouriteModel> {
        val favouritesArrayList = ArrayList<FavouriteModel>()
        val db = dbHelper.writableDatabase

        // Üyenin favori yemeklerini getirmek için bir sorgu hazırla
        val cursor = db.rawQuery(
            "SELECT * FROM favourite_meals",
            null
        )

        // Cursor üzerinde dönerek her bir favori yemeği al ve favoriler listesine ekle
        cursor.use {
            while (it.moveToNext()) {
                val favourite = FavouriteModel(
                    it.getInt(it.getColumnIndexOrThrow("favourite_id")),
                    it.getString(it.getColumnIndexOrThrow("product_id"))
                )
                favouritesArrayList.add(favourite)
            }
        }
        return favouritesArrayList
    }


    // favori kokteyllerini getiren fonksiyon
    @SuppressLint("Recycle")
    fun getFavouriteCocktails(dbHelper: DbHelper): ArrayList<FavouriteModel> {
        val favouritesArrayList = ArrayList<FavouriteModel>()

        val db = dbHelper.writableDatabase

        // favori kokteyllerini getirmek için bir sorgu hazırla
        val cursor = db.rawQuery(
            "SELECT * FROM favourite_cocktails",
            null
        )

        // Cursor üzerinde dönerek her bir favori kokteyli al ve favoriler listesine ekle
        if (cursor.count > 0) {
            cursor.use {
                while (it.moveToNext()) {
                    val favourite = FavouriteModel(
                        it.getInt(it.getColumnIndexOrThrow("favourite_id")),
                        it.getString(it.getColumnIndexOrThrow("product_id"))
                    )
                    favouritesArrayList.add(favourite)
                }
            }
        }

        return favouritesArrayList
    }

    // favori yemeklerini silen fonksiyon
    fun deleteFavouriteMeal(dbHelper: DbHelper, product_id: String) {
        val db = dbHelper.writableDatabase

        // Favori yemeği silme sorgusu
        db.delete("favourite_meals", "product_id = ?", arrayOf(product_id))

        db.close()
    }

    // koktely yemeklerini silen fonksiyon
   /* @SuppressLint("DetachAndAttachSameFragment")
    fun deleteFavouriteCocktail(dbHelper: DbHelper, product_id: String) {
        val db = dbHelper.writableDatabase

        // koktely yemeği silme sorgusu
        db.delete("favourite_cocktails", "product_id = ?", arrayOf(product_id))

        db.close()
    }*/
    fun deleteFavouriteCocktail(dbHelper: DbHelper, product_id: String): Boolean {
        val db = dbHelper.writableDatabase
        val deletedRows = db.delete("favourite_cocktails", "product_id = ?", arrayOf(product_id))
        db.close()
        return deletedRows > 0
    }


}

    
import android.widget.Toast
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.volkan.delishdish.Database.DbHelper
import com.volkan.delishdish.Database.FavouriteDBO
import com.volkan.delishdish.Models.FavouriteModel
import com.volkan.delishdish.Models.ModelCocktails
import com.volkan.delishdish.Models.ModelCocktailsAnswer
import com.volkan.delishdish.Models.ModelMeals
import com.volkan.delishdish.Models.ModelMealsAnswer
import com.volkan.delishdish.RestApi.ApiUtils
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class FavouriteViewModel : ViewModel() {

    // Favori yemeklerin LiveData'sı
    private val _favouriteMeals = MutableLiveData<List<ModelMeals>>()
    val favouriteMeals: LiveData<List<ModelMeals>>
        get() = _favouriteMeals

    // Favori kokteyllerin LiveData'sı
    private val _favouriteCocktails = MutableLiveData<List<ModelCocktails>>()
    val favouriteCocktails: LiveData<List<ModelCocktails>>
        get() = _favouriteCocktails

    // Hata mesajlarının LiveData'sı
    private val _error = MutableLiveData<String>()
    val error: LiveData<String>
        get() = _error

    val favouriteDBO = FavouriteDBO()

    // Favori yemeklerin alınması
    fun getFavouriteMeals(dbHelper: DbHelper) {
        // FavoriDBO sınıfı oluşturulur
        val favouriteDBO = FavouriteDBO()
        // Veritabanından favori yemek listesi alınır
        val favouriteList = favouriteDBO.getFavourites(dbHelper)

        // Favori yemeklerin ürün ID'leri alınır
        val favouriteListProductIds = favouriteList.map { it.product_id }

        // API çağrısı yapmak için Retrofit üzerinden Meals API servisi alınır
        val kdi = ApiUtils.getMeals()
        val tempList = mutableListOf<ModelMeals>()

        // Her bir favori yemek ürün ID'si için API çağrısı yapılır
        favouriteListProductIds.forEach { productId ->
            kdi.mealsFavouriteList(productId.toInt()).enqueue(object : Callback<ModelMealsAnswer> {
                override fun onResponse(
                    call: Call<ModelMealsAnswer>,
                    response: Response<ModelMealsAnswer>
                ) {
                    // Yanıt başarılı ise ve içeriği varsa
                    if (response.isSuccessful && response.body() != null && response.body()?.meals != null) {
                        // Geçici listeye yanıttaki yemekler eklenir
                        tempList.addAll(response.body()!!.meals)

                        // Geçici liste tamamen doldurulduğunda, LiveData'ya atama yapılır
                        if (tempList.size == favouriteListProductIds.size) {
                            _favouriteMeals.value = tempList
                        }
                    }
                }

                override fun onFailure(call: Call<ModelMealsAnswer>, t: Throwable) {
                    // API çağrısı başarısız olduğunda hata mesajı LiveData'ya atanır
                    _error.value = "Bir hata oluştu: ${t.message}"
                }
            })
        }
    }

    // Favori kokteyllerin alınması
    fun getFavouriteCocktails(dbHelper: DbHelper) {
        // FavoriDBO sınıfı oluşturulur
        val favouriteDBO = FavouriteDBO()
        // Veritabanından favori kokteyl listesi alınır
        val favouriteList = favouriteDBO.getFavouriteCocktails(dbHelper)

        // Favori kokteyllerin ürün ID'leri alınır
        val favouriteListProductIds = favouriteList.map { it.product_id }

        // API çağrısı yapmak için Retrofit üzerinden Cocktails API servisi alınır
        val kdi = ApiUtils.getCocktails()
        val tempList = mutableListOf<ModelCocktails>()

        // Her bir favori kokteyl ürün ID'si için API çağrısı yapılır
        favouriteListProductIds.forEach { productId ->
            kdi.cocktailsFavouriteList(productId.toInt())
                .enqueue(object : Callback<ModelCocktailsAnswer> {
                    override fun onResponse(
                        call: Call<ModelCocktailsAnswer>,
                        response: Response<ModelCocktailsAnswer>
                    ) {
                        // Yanıt başarılı ise ve içeriği varsa
                        if (response.isSuccessful && response.body() != null && response.body()?.drinks != null) {
                            // Geçici listeye yanıttaki kokteyller eklenir
                            tempList.addAll(response.body()!!.drinks)

                            // Geçici liste tamamen doldurulduğunda, LiveData'ya atama yapılır
                            if (tempList.size == favouriteListProductIds.size) {
                                _favouriteCocktails.value = tempList
                            }
                        }
                    }

                    override fun onFailure(call: Call<ModelCocktailsAnswer>, t: Throwable) {
                        // API çağrısı başarısız olduğunda hata mesajı LiveData'ya atanır
                        _error.value = "Bir hata oluştu: ${t.message}"
                    }
                })
        }

    }



}

favorilerme eklediğim ürünü sildiğim zaman veritabanından ve recyclerview'den siliniyor ama listeden silinmiyor. Bu nedenle sayfa geçişi yapıp tekrar favoriFragment'a gelince recyclerview veri tekrar gözüküyor. ne yapmalıyım?

Cevap yaz
Cevaplar (0)
Henüz kimse cevap yazmadı. İlk cevap yazan sen ol!