当 Activity 重新启动时,MutableMap 会重新初始化

时间:2021-04-19 13:27:48

标签: java android kotlin android-recyclerview

我正在制作一个应用程序,以在 recylerview 中显示来自 firestore 的数据,并在滑动操作时为用户(而不是从数据库)删除数据,因此我创建了一个地图(在我的导入下方),它将保留我的密钥和数组(用于回收站)看法)。 问题是,当用户打开 Activity 并滑动数据时,它会在应用程序的该生命周期内为用户删除。 当用户重新打开应用程序时,所有数据都显示在活动中(包括用户刷过的数据) 我知道我的代码有点长,但我是 android 开发者的新手。 对此问题的编辑将不胜感激,并提前致谢

import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.FirebaseFirestore
import com.ikgptu.stook.databinding.ActivityNotificationDashboardBinding

var notificationMap : MutableMap<String,NotificationClass> = mutableMapOf()
class NotificationDashboard : AppCompatActivity() {
    private lateinit var binding: ActivityNotificationDashboardBinding
    private lateinit var mAuth: FirebaseAuth
    //Array To store and send data to adapter
    private var notificationArray: ArrayList<NotificationClass> = arrayListOf()
    //Views
    private lateinit var myRecylerView: RecyclerView
    //Adapter
    private lateinit var myRecyclerAdapter: MyRecyclerAdapter
    //Collection ID 
    private lateinit var collID: String
    private lateinit var userEmail: String
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityNotificationDashboardBinding.inflate(layoutInflater)
        setContentView(binding.root)
        //Getting Email
        mAuth = FirebaseAuth.getInstance()
        val currentUser = mAuth.currentUser
        userEmail = currentUser?.email.toString()
        //End
        //Binding View
        myRecylerView = binding.notiRecylerView
        //Getting ID
        val db = FirebaseFirestore.getInstance()
        db.collection("users").document(userEmail).get()
                .addOnSuccessListener { document ->
                    if (document != null) {
                        Log.d("Found", "DocumentSnapshot data: ${document.getString("collectionID")}")
                        collID = document.getString("collectionID").toString()
                        searchFireStore()
                        Toast.makeText(this,"Refreshed", Toast.LENGTH_SHORT).show()
                    } else {
                        Log.d("Wrong", "No such document")
                    }
                }
        //Specifying Drag Direction
        ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
            override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
                return false
            }
            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                val deletedCourse: NotificationClass = notificationArray[viewHolder.adapterPosition]
                val position = viewHolder.adapterPosition
                val documentID = notificationArray[position].docID
                notificationMap[documentID]!!.status = false
                notificationArray = arrayListOf()
                for(key in notificationMap.keys){
                    if(notificationMap[key]!!.status){
                        notificationArray.add(notificationMap[key]!!)
                    }
                }
                myRecyclerAdapter.notifyItemRemoved(viewHolder.adapterPosition)
                Snackbar.make(myRecylerView, deletedCourse.title.toString(), Snackbar.LENGTH_SHORT).setAction("Undo") { // adding on click listener to our action of snack bar.

                    notificationMap[documentID]!!.status = true
                    notificationArray = arrayListOf()
                    for (key in notificationMap.keys) {
                        if (notificationMap[key]!!.status) {
                            notificationArray.add(notificationMap[key]!!)
                        }
                    }
                    myRecyclerAdapter.notifyItemInserted(position)
                }.show()
            }
        }).attachToRecyclerView(myRecylerView)
        
     }
    private fun searchFireStore(){
        //Firestore Search
        val db = FirebaseFirestore.getInstance()
        db.collection(collID).get()
                .addOnCompleteListener { task ->
                    if (task.isSuccessful) {
                        for (document in task.result!!) {
                            Log.d("Start", document.id + " => " + document.data)
                            val notification = NotificationClass(document.data["Title"] as String?, document.data["Notification"] as String?,true,document.id)
                            if(!notificationMap.containsKey(document.id)){
                                notificationMap[document.id] = notification
                            }
                            Log.d("Success", "Documents fetched successfully")
                        }
                        for(key in notificationMap.keys){
                            if(notificationMap.get(key)?.status == true){
                                notificationArray.add(notificationMap[key]!!)
                            }
                        }
                        myRecylerView.layoutManager = LinearLayoutManager(this)
                        myRecyclerAdapter = MyRecyclerAdapter(notificationArray)
                        myRecylerView.adapter = myRecyclerAdapter
                        myRecyclerAdapter.notifyDataSetChanged()

                        Log.d("FOR", "Success of FOR LOOP") 
                    } 
            }
        }
}

1 个答案:

答案 0 :(得分:0)

如果您“杀死”您的应用,然后再次打开它,则 Activity 的 onCreate() 函数将再次被调用,并且您的应用的行为与首次启动时完全相同。如果您希望您的应用不显示被刷过的项目,您必须以某种方式保留信息,哪些元素被刷过,并在下一次 Activity 创建期间使用它来从列表中排除被刷过的元素。