保持卡片內的圖像可見在回收器上查看旋轉設備后的視圖

我正在嘗試在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"的單獨類,并在其中粘貼以下代碼:

 class UserPreferences {
    // Store all Sharedpreferences methods in here
    fun getPositionPref(fragment: Fragment): Int {
        return fragment.requireActivity().getSharedPreferences(
            "myPref",
            Context.MODE_PRIVATE
        ).getInt(
            "positionPref",
            -1
        )
    }

    fun setPositionPref(fragment: Fragment, position: Int) {
        val sharedPreferences =
            fragment.requireActivity().getSharedPreferences(
                "myPref",
                Context.MODE_PRIVATE
            )
        val editor: SharedPreferences.Editor = sharedPreferences.edit()
        editor.putInt(
            "positionPref",
            position
        )
        editor.apply()
    }
}

在代碼中,讓我們做一些調整:

class ImagesFragment : Fragment(), GridItemAdapter.OnItemClickListener {
    private lateinit var binding: FragmentImagesBinding
    //edited
    private var hasFavourite : Int = -1

   override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentImagesBinding.inflate(inflater, container, false)
        hasFavourite = UserPreferences().getPositionPref(this)
        // Now you get what's in sharedPreferences.
        // If it's first time it will be -1 for default.
        val cardImages : Array<String> = 
        resources.getStringArray(R.array.cardImages)
        val adapter = GridItemAdapter(cardImages, this, hasFavourite)
        // send hasFavourite to adapter too.
        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 == -1) {
            Toast.makeText(context, "Address: $address", Toast.LENGTH_SHORT).show()

            UserPreferences().setPositionPref(this, position)
            // Now we set it to position, for another time you wanna get

            //putString("favAddress", address)
            //putBoolean("favStatus", favStatus)
            //For this two, you need to create it's own functions in 
            // UserPreferences class we created, you got the idea
            
            favImage.visibility = View.VISIBLE
            hasFavourite = UserPreferences().getPositionPref(this)
            // We get the new value of hasFavourite from shared pref again.
            Toast.makeText(context, "Item $position set to favourite", Toast.LENGTH_SHORT).show()
        }
         else if (hasFavourite == position) {
            favImage.visibility = View.GONE
            //edited
            UserPreferences().setPositionPref(this, -1)
            hasFavourite = UserPreferences().getPositionPref(this)
           // We set it to default, there should be no item favorited
        }
        else {
            Toast.makeText(context, "Favourite already set at position $hasFavourite", Toast.LENGTH_SHORT).show()
        }
    }

}

所以,假設您選擇了一個收藏夾,然后關閉應用程序并再次打開,它不會以應用于適配器的收藏夾開始,直到您單擊其中一項解決此問題,我們在開始時將hasFavourite發送給適配器:

class GridItemAdapter(
    val cardImages: Array<String>,
    private val listener: OnItemClickListener,
    private val hasFavourite: Int) :
    RecyclerView.Adapter<GridItemAdapter.ViewHolder>() {

   // and onBind we check and set:
   override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        Picasso.get().load(cardImages[position]).into(holder.cardImage)
        if (hasFavourite == position) {
          holder.favImage.visibility = View.VISIBLE
        }
   }

我想這應該能奏效,還沒試過,如果不奏效,請告訴我。

主站蜘蛛池模板: 无码人妻一区二区三区免费视频| 久久99国产精品一区二区| 国产成人综合一区精品| 91在线视频一区| 无码国产精品一区二区免费虚拟VR| 一区二区亚洲精品精华液| 无码人妻精品一区二区蜜桃| 亚洲欧美国产国产一区二区三区| 在线观看日韩一区| 中文字幕一区二区三区永久| 国产精品丝袜一区二区三区| 中文字幕在线不卡一区二区| 高清一区高清二区视频| 精品一区二区三区免费| 亚洲乱码av中文一区二区| 日韩精品一区二区三区在线观看| 国产一区三区二区中文在线| 亚洲AV无码一区东京热| 综合久久一区二区三区 | 在线精品动漫一区二区无广告| 在线精品亚洲一区二区小说| 3D动漫精品一区二区三区| 视频在线一区二区三区| 97av麻豆蜜桃一区二区| 国产伦精品一区二区三区视频猫咪| 无码人妻精品一区二区| 国产主播一区二区三区 | 日韩精品国产一区| 一本大道东京热无码一区| 午夜一区二区在线观看| 午夜天堂一区人妻| 日韩有码一区二区| 亚洲日韩一区二区三区| 国产精品无码AV一区二区三区 | 国产日韩精品一区二区在线观看 | 亚洲午夜精品第一区二区8050| 78成人精品电影在线播放日韩精品电影一区亚洲 | 中文字幕精品无码一区二区| 一区二区三区无码被窝影院| 农村人乱弄一区二区| 国产一区二区三区四|