class Utils { companion object { private const val SECOND_MILLIS = 1000 private const val MINUTE_MILLIS = 60 * SECOND_MILLIS private const val HOUR_MILLIS = 60 * MINUTE_MILLIS private const val DAY_MILLIS = 24 * HOUR_MILLIS fun getTimeAgo(time: Long): String? { val now: Long = System.currentTimeMillis() if (time > now || time <= 0) { return null } val diff = now - time return if (diff < MINUTE_MILLIS) { "just now" } else if (diff < 2 * MINUTE_MILLIS) { "a minute ago" } else if (diff < 50 * MINUTE_MILLIS) { (diff / MINUTE_MILLIS).toString() + " minutes ago" } else if (diff < 90 * MINUTE_MILLIS) { "an hour ago" } else if (diff < 24 * HOUR_MILLIS) { (diff / HOUR_MILLIS).toString() + " hours ago" } else if (diff < 48 * HOUR_MILLIS) { "yesterday" } else { (diff / DAY_MILLIS).toString() + " days ago" } } } } inner class PostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ fun bind(userPost: Post) { val postText: TextView = itemView.findViewById(R.id.postTitle) val userText: TextView = itemView.findViewById(R.id.userName) val createdAt: TextView = itemView.findViewById(R.id.createdAt) val likeCount: TextView = itemView.findViewById(R.id.likeCount) val userImage: ImageView = itemView.findViewById(R.id.userImage) val likeButton: ImageView = itemView.findViewById(R.id.likeButton) postText.text = userPost.text userText.text = userPost.createdBy.displayName Glide.with(userImage.context).load(userPost.createdBy.imageUrl).circleCrop().into(userImage) likeCount.text = userPost.likeBy.size.toString() createdAt.text = Utils.getTimeAgo(userPost.createdAt) likeButton.setOnClickListener { listener.onLikeClicked(layoutPosition) } val currentUserId = Firebase.auth.currentUser!!.uid val isLiked = userPost.likeBy.contains(currentUserId) if(isLiked){ likeButton.setImageDrawable(ContextCompat.getDrawable(likeButton.context, R.drawable.ic_liked)) }else{ likeButton.setImageDrawable(ContextCompat.getDrawable(likeButton.context, R.drawable.ic_unlike)) } } } ---- ---- interface IPostAdapter{ fun onLikeClicked(position: Int) } private var db: FirebaseFirestore = FirebaseFirestore.getInstance() private fun getFirebasePostData() { db = FirebaseFirestore.getInstance() val postCollections = db.collection("posts") postCollections.orderBy("createdAt", Query.Direction.DESCENDING) .addSnapshotListener { snapshot, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } if (snapshot != null) { for (dc: DocumentChange in snapshot.documentChanges) { if (dc.type == DocumentChange.Type.ADDED) { userPostList.add(dc.document.toObject(Post::class.java)) } } postAdapter.notifyDataSetChanged() } } } like
override fun onLikeClicked(position: Int) { userPostId = arrayListOf() // Retrieve the data from the Firebase collection val postsRef = db.collection("posts") GlobalScope.launch { postsRef.orderBy("createdAt", Query.Direction.DESCENDING).get() .addOnSuccessListener { QuerySnapshot -> for (document in QuerySnapshot) { userPostId.add(document) } val selectedItem = userPostId[position] // retrieve the fields of the clicked document using the documentId val text = selectedItem.get("text") val title = selectedItem["title"] as String val imageUrl = selectedItem.get("imageUrl") postDao = PostDao() postDao.updateLike(selectedItem) Log.e(TAG, selectedItem.toString()) // Notify the adapter that the data has changed postAdapter.notifyDataSetChanged() }.await() } } fun updateLike(selectedPost: DocumentSnapshot){ val currentUserId = auth.currentUser!!.uid val post = selectedPost.toObject(Post::class.java) val isLiked = post!!.likeBy.contains(currentUserId) if(isLiked){ post.likeBy.remove(currentUserId) }else{ post.likeBy.add(currentUserId) } postCollections.document(selectedPost.id).set(post) } To access a specific document from a Firestore query result, you can use the getDocuments() method on the query result object and iterate over the list of documents until you find the one with the matching position.
val postsRef = FirebaseFirestore.getInstance().collection("posts") postsRef.orderBy("createdAt", Query.Direction.DESCENDING).get() .addOnSuccessListener { result -> val documents = result.documents for ((index, document) in documents.withIndex()) { if (index == position) { // The document with the matching position has been found val selectedDocument = document // Do something with the selected document... break } } } .addOnFailureListener { exception -> // Handle the error... } retrieve the data from the Firebase collection and add each document to this list. The list is then used to populate the RecyclerView with the data.
val postsList = mutableListOf<DocumentSnapshot>() // Retrieve the data from the Firebase collection val postsRef = firebaseFirestore.collection("posts") postsRef.orderBy("createdAt", Query.Direction.DESCENDING).get() .addOnSuccessListener { for (document in it) { postsList.add(document) } // Notify the adapter that the data has changed recyclerViewAdapter.notifyDataSetChanged() } you can access the position of the clicked item and use that to retrieve the corresponding document from the Firebase collection.
recyclerView.addOnItemTouchListener( RecyclerItemClickListener(context, recyclerView, object : RecyclerItemClickListener.OnItemClickListener { override fun onItemClick(view: View, position: Int) { val selectedDocument = postsList[position] val documentId = selectedDocument.id // retrieve the fields of the clicked document using the documentId val text = selectedDocument.get("text") val imageUrl = selectedDocument.get("imageUrl") // Do something with the selected document's fields... } }) ) CoroutineScope(Dispatchers.IO).launch { val post = postDao.postCollections.document(postId).get().await().toObject(Post::class.java) val messageToId = post?.createdBy?.uid val messageToName = post?.createdBy?.displayName withContext(Dispatchers.Main){ val action = HomeFragmentDirections.actionHomeFragmentToChatFragment(messageToId!!, messageToName!!) findNavController().navigate(action) } } postDao.postCollections.document(postId).get().addOnSuccessListener { val post = it.toObject(Post::class.java) if (post != null) { val messageToId = post.createdBy.uid val messageToName = post.createdBy.displayName val action = HomeFragmentDirections.actionHomeFragmentToChatFragment(messageToId, messageToName!!) findNavController().navigate(action) } }
Top comments (0)