我正在制作一个应用程序,以在 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")
}
}
}
}
答案 0 :(得分:0)
如果您“杀死”您的应用,然后再次打开它,则 Activity 的 onCreate()
函数将再次被调用,并且您的应用的行为与首次启动时完全相同。如果您希望您的应用不显示被刷过的项目,您必须以某种方式保留信息,哪些元素被刷过,并在下一次 Activity 创建期间使用它来从列表中排除被刷过的元素。