Favorilerden sildiğim ürün recyclerview'de tekrar gözüküyor?
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?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (0)
Henüz kimse cevap yazmadı. İlk cevap yazan sen ol!