我正在嘗試在Kotlin中為一個學校項目制作一個簡單的Android應用程序,該應用程序顯示了一些來自互聯網的圖像。這些圖像顯示在cardView中,在具有網格布局的recyclerView中。
在每個cardView中,我都會從picsum中獲得一個隨機圖像,我還有一個星形圖標,用于將圖像標記為最喜愛的圖像。此工作的目的是使用sharedPreferences。因此,我必須存儲哪個圖像被設置為收藏夾(一次只能有一個),并存儲該位置,以便每當我旋轉設備時,圖標保持可見。
我應該如何存儲它,以及我應該在哪個函數中調用sharedPreferences數據來顯示圖標?
Adapter.kt
package com.example.bottomnavigationapp.fragimages.ui
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.example.bottomnavigationapp.R
import com.squareup.picasso.Picasso
class GridItemAdapter(
val cardImages: Array<String>,
private val listener: OnItemClickListener) :
RecyclerView.Adapter<GridItemAdapter.ViewHolder>() {
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener{
val cardImage : ImageView = itemView.findViewById(R.id.cardImage)
val favImage : ImageView = itemView.findViewById(R.id.favImage)
init {
cardImage.setOnClickListener(this)
}
override fun onClick(v: View?) {
var position : Int = adapterPosition
val address = cardImages[position]
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position, favImage, address)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view =
LayoutInflater.from(parent.context).inflate(R.layout.grid_item_view, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
Picasso.get().load(cardImages[position]).into(holder.cardImage)
}
override fun getItemCount(): Int {
return cardImages.size
}
interface OnItemClickListener {
fun onItemClick(position: Int, favImage: ImageView, address: String)
}
}
Fragment.kt
package com.example.bottomnavigationapp.fragimages.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import com.example.bottomnavigationapp.R
import com.example.bottomnavigationapp.databinding.FragmentImagesBinding
class ImagesFragment : Fragment(), GridItemAdapter.OnItemClickListener {
private lateinit var binding: FragmentImagesBinding
var hasFavourite : Int = -1
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentImagesBinding.inflate(inflater, container, false)
val cardImages : Array<String> = resources.getStringArray(R.array.cardImages)
val adapter = GridItemAdapter(cardImages, this)
val gridLayout = GridLayoutManager(context, 2)
binding.gridItems.layoutManager = gridLayout
binding.gridItems.adapter = adapter
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
(activity as AppCompatActivity?)!!.supportActionBar!!.title = "Images Fragment"
super.onViewCreated(view, savedInstanceState)
}
override fun onItemClick(position: Int, favImage: ImageView, address: String) {
if (hasFavourite < 0) {
Toast.makeText(context, "Address: $address", Toast.LENGTH_SHORT).show()
val favAddress = address
val favStatus = true
val sharedPreferences = requireActivity().applicationContext.getSharedPreferences("myPref", 0)
val editor = sharedPreferences.edit()
editor.apply {
putString("favAddress", address)
putBoolean("favStatus", favStatus)
}
favImage.visibility = View.VISIBLE
hasFavourite = position
Toast.makeText(context, "Item $position set to favourite", Toast.LENGTH_SHORT).show()
}
else if (hasFavourite == position) {
favImage.visibility = View.GONE
hasFavourite = -1
}
else {
Toast.makeText(context, "Favourite already set at position $hasFavourite", Toast.LENGTH_SHORT).show()
}
}
}
這是因為你一直在嘗試設置偏好,但沒有得到它們。創建名為"UserPreferences.kt"的單獨類,并在其中粘貼以下代碼:
在代碼中,讓我們做一些調整:
所以,假設您選擇了一個收藏夾,然后關閉應用程序并再次打開,它不會以應用于適配器的收藏夾開始,直到您單擊其中一項解決此問題,我們在開始時將hasFavourite發送給適配器:
我想這應該能奏效,還沒試過,如果不奏效,請告訴我。