Эй , ребята, появилась новая проблема...
я пытаюсь запустить свое приложение и получаю вот это
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.intskot, PID: 12203 com.google.firebase.database.DatabaseException: Found setter with invalid case-sensitive name: setPostId at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.<init>(CustomClassMapper.java:506) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.loadOrCreateBeanMapperForClass(CustomClassMapper.java:330) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:431) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203) at com.example.intskot.fragments.NotificationsFragment$readNotifications$1.onDataChange(NotificationsFragment.kt:65) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) at android.os.Handler.handleCallback(Handler.java:907) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7478) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
мой notificationFragment-это:
package com.example.intskot.fragments import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.intskot.Model.Notification import com.example.intskot.R import com.example.intskot.adapter.NotificationAdapter import com.google.firebase.auth.FirebaseAuth import com.google.firebase.database.DataSnapshot import com.google.firebase.database.DatabaseError import com.google.firebase.database.FirebaseDatabase import com.google.firebase.database.ValueEventListener import java.util.* import kotlin.collections.ArrayList class NotificationsFragment : Fragment() { private var notificationList: List<Notification>? = null private var notificationAdapter: NotificationAdapter? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment val view = inflater.inflate(R.layout.fragment_notifications, container, false) val recyclerView: RecyclerView recyclerView = view.findViewById(R.id.recycler_view_notifications) recyclerView?.setHasFixedSize(true) recyclerView?.layoutManager = LinearLayoutManager(context) notificationList = ArrayList() notificationAdapter = NotificationAdapter(this.requireContext(), notificationList as ArrayList<Notification>) recyclerView.adapter = notificationAdapter readNotifications() return view } private fun readNotifications() { val notiRef = FirebaseDatabase.getInstance() .reference.child("Notifications") .child(FirebaseAuth.getInstance().currentUser!!.uid) notiRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { if (dataSnapshot.exists()) { (notificationList as ArrayList<Notification>).clear() for (snapshot in dataSnapshot.children) { val notification = snapshot.getValue(Notification::class.java) (notificationList as ArrayList<Notification>).add(notification!!) } Collections.reverse(notificationList!!) notificationAdapter!!.notifyDataSetChanged() } } override fun onCancelled(error: DatabaseError) { } }) } }
моя модель notification.kt-это:
package com.example.intskot.model class Notification { private var userid: String = "" private var text: String = "" private var postid: String = "" private var ispost = false constructor() constructor(userid: String, text: String, postid: String, ispost: Boolean) { this.userid = userid this.text = text this.postid = postid this.ispost = ispost } fun getUserid(): String { return userid } fun getText(): String { return text } fun getPostid(): String { return postid } fun isIsPost(): Boolean { return ispost } fun setUserId(userid: String) { this.userid = userid } fun setTextId(text: String) { this.text = text } fun setPostId(postid: String) { this.postid = postid } fun setIsPost(ispost: Boolean) { this.ispost = ispost } }
постадаптер это:
package com.example.intskot.adapter import android.content.Context import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.annotation.NonNull import androidx.recyclerview.widget.RecyclerView import com.example.intskot.CommentsActivity import com.example.intskot.MainActivity import com.example.intskot.R import com.example.intskot.ShowUsersActivity import com.example.intskot.model.Post import com.example.intskot.model.User import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.FirebaseUser import com.google.firebase.database.DataSnapshot import com.google.firebase.database.DatabaseError import com.google.firebase.database.FirebaseDatabase import com.google.firebase.database.ValueEventListener import com.squareup.picasso.Picasso import de.hdodenhof.circleimageview.CircleImageView class PostAdapter (private val mContext: Context, private val mPost: List<Post>) : RecyclerView.Adapter<PostAdapter.ViewHolder>() { private var firebaseUser:FirebaseUser? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(mContext).inflate(R.layout.posts_layout, parent, false) return ViewHolder(view) } override fun getItemCount(): Int { return mPost.size } override fun onBindViewHolder(holder: ViewHolder, position: Int) { firebaseUser = FirebaseAuth.getInstance().currentUser val post = mPost[position] Picasso.get().load(post.getPostimage()).into(holder.postImage) if (post.getDescription() == "") { holder.description.visibility = View.GONE } else { holder.description.visibility = View.VISIBLE holder.description.text = post.getDescription() } publisherInfo(holder.profileImage, holder.userName, holder.publisher, post.getPublisher()) isLikes(post.getPostid(), holder.likeButton) numberOfLikes(holder.likes, post.getPostid()) getTotalComments(holder.comments, post.getPostid()) checkSavedStatus(post.getPostid(), holder.saveButton) holder.likeButton.setOnClickListener{ if (holder.likeButton.tag == "Like") { FirebaseDatabase.getInstance().reference .child("Likes") .child(post.getPostid()) .child(firebaseUser!!.uid) .setValue(true) addNotification(post.getPublisher(), post.getPostid()) } else { FirebaseDatabase.getInstance().reference .child("Likes") .child(post.getPostid()) .child(firebaseUser!!.uid) .removeValue() val intent = Intent(mContext, MainActivity::class.java) mContext.startActivity(intent) } } holder.likes.setOnClickListener { val intent = Intent(mContext, ShowUsersActivity::class.java) intent.putExtra("id",post.getPostid()) intent.putExtra("title", "likes") mContext.startActivity(intent) } holder.commentButton.setOnClickListener { val intentComment = Intent(mContext, CommentsActivity::class.java) intentComment.putExtra("postId", post.getPostid()) intentComment.putExtra("publisherId", post.getPublisher()) mContext.startActivity(intentComment) } holder.comments.setOnClickListener{ val intentComment = Intent(mContext, CommentsActivity::class.java) intentComment.putExtra("postId", post.getPostid()) intentComment.putExtra("publisherId", post.getPublisher()) mContext.startActivity(intentComment) } holder.saveButton.setOnClickListener { if (holder.saveButton.tag == "Save") { FirebaseDatabase.getInstance().reference .child("Saves") .child(firebaseUser!!.uid) .child(post.getPostid()) .setValue(true) } else { FirebaseDatabase.getInstance().reference .child("Saves") .child(firebaseUser!!.uid) .child(post.getPostid()) .removeValue() } } } private fun numberOfLikes(likes: TextView, postid: String) { val likesRef = FirebaseDatabase.getInstance().reference .child("Likes").child(postid) likesRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(p0: DataSnapshot) { if (p0.exists()) { likes.text = p0.childrenCount.toString() + " likes" } } override fun onCancelled(p0: DatabaseError) { } }) } private fun getTotalComments(comments: TextView, postid: String) { val commentsRef = FirebaseDatabase.getInstance().reference .child("Comments").child(postid) commentsRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(p0: DataSnapshot) { if (p0.exists()) { comments.text = "view all" + p0.childrenCount.toString() + " comments" } } override fun onCancelled(p0: DatabaseError) { } }) } private fun isLikes(postid: String, likeButton: ImageView) { val firebaseUser = FirebaseAuth.getInstance().currentUser val likesRef = FirebaseDatabase.getInstance().reference .child("Likes").child(postid) likesRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(p0: DataSnapshot) { if (p0.child(firebaseUser!!.uid).exists()) { likeButton.setImageResource(R.drawable.heart_clicked) likeButton.tag = "liked" } else { likeButton.setImageResource(R.drawable.heart_not_clicked) likeButton.tag = "Like" } } override fun onCancelled(p0: DatabaseError) { } }) } inner class ViewHolder(@NonNull itemView: View) : RecyclerView.ViewHolder(itemView) { var profileImage: CircleImageView = itemView.findViewById(R.id.user_profile_image_post) var postImage: ImageView = itemView.findViewById(R.id.post_image_home) var likeButton: ImageView = itemView.findViewById(R.id.post_image_like_btn) var commentButton: ImageView = itemView.findViewById(R.id.post_image_comment_btn) var saveButton: ImageView = itemView.findViewById(R.id.post_save_comment_btn) var userName: TextView = itemView.findViewById(R.id.user_name_post) var likes: TextView = itemView.findViewById(R.id.likes) var publisher: TextView = itemView.findViewById(R.id.publisher) var description: TextView = itemView.findViewById(R.id.description) var comments: TextView = itemView.findViewById(R.id.comments) } private fun publisherInfo(profileImage: CircleImageView, userName: TextView, publisher: TextView, publisherID: String) { val usersRef = FirebaseDatabase.getInstance().reference.child("Users").child(publisherID) usersRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(p0: DataSnapshot) { if (p0.exists()) { val user = p0.getValue<User>(User::class.java) Picasso.get().load(user!!.getImage()).placeholder(R.drawable.profile).into(profileImage) userName.text = user!!.getUsername() publisher.text = user!!.getFullname() } } override fun onCancelled(p0: DatabaseError) { } }) } private fun checkSavedStatus(postid: String, imageView: ImageView) { val savesRef = FirebaseDatabase.getInstance().reference .child("Saves") .child(firebaseUser!!.uid) savesRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(p0: DataSnapshot){ if (p0.child(postid).exists()) { imageView.setImageResource(R.drawable.save_large_icon) imageView.tag = "Saved" } else { imageView.setImageResource(R.drawable.save_unfilled_large_icon) imageView.tag = "Save" } } override fun onCancelled(p0: DatabaseError) { } }) } private fun addNotification(userId: String, postId: String) { val notiRef = FirebaseDatabase.getInstance() .reference.child("Notifications") .child(userId) val notiMap = HashMap<String, Any>() notiMap["userid"] = firebaseUser!!.uid notiMap["text"] = "liked your post" notiMap["postid"] = postId notiMap["ispost"] = true notiRef.push().setValue(notiMap) } }
пользовательский адаптер:
package com.example.intskot.adapter import android.content.Context import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import android.widget.TextView import androidx.annotation.NonNull import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.RecyclerView import com.example.intskot.MainActivity import com.example.intskot.R import com.example.intskot.fragments.ProfileFragment import com.example.intskot.model.User import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.FirebaseUser import com.google.firebase.database.DataSnapshot import com.google.firebase.database.DatabaseError import com.google.firebase.database.FirebaseDatabase import com.google.firebase.database.ValueEventListener import com.squareup.picasso.Picasso import de.hdodenhof.circleimageview.CircleImageView class UserAdapter (private var mContext: Context, private var mUser: List<User>, private var isFragment: Boolean = false) : RecyclerView.Adapter<UserAdapter.ViewHolder>() { private var firebaseUser: FirebaseUser? = FirebaseAuth.getInstance().currentUser override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserAdapter.ViewHolder { val view = LayoutInflater.from(mContext).inflate(R.layout.user_item_layout, parent, false) return UserAdapter.ViewHolder(view) } override fun onBindViewHolder(holder: UserAdapter.ViewHolder, position: Int) { val user = mUser[position] holder.userNameTextView.text = user.getUsername() holder.userFullNameTextView.text = user.getFullname() Picasso.get().load(user.getImage()).placeholder(R.drawable.profile).into(holder.userProfileImage) checkFollowingStatus(user.getUID(), holder.followButton) holder.itemView.setOnClickListener ( View.OnClickListener { if (isFragment) { val pref = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit() pref.putString("profileId", user.getUID()) pref.apply() (mContext as FragmentActivity).supportFragmentManager.beginTransaction() .replace(R.id.fragment_container, ProfileFragment()).commit() } else { val intent = Intent(mContext, MainActivity::class.java) intent.putExtra("publisherId", user.getUID()) mContext.startActivity(intent) } } ) holder.followButton.setOnClickListener { if (holder.followButton.text.toString() == "Follow") { firebaseUser?.uid.let { it1 -> FirebaseDatabase.getInstance().reference .child("Follow").child(it1.toString()) .child("Following").child(user.getUID()) .setValue(true).addOnCompleteListener { task -> if (task.isSuccessful) { firebaseUser?.uid.let { it1 -> FirebaseDatabase.getInstance().reference .child("Follow").child(user.getUID()) .child("Followers").child(it1.toString()) .setValue(true).addOnCompleteListener { task -> if (task.isSuccessful) { } } } } } } addNotification(user.getUID()) } else { firebaseUser?.uid.let { it1 -> FirebaseDatabase.getInstance().reference .child("Follow").child(it1.toString()) .child("Following").child(user.getUID()) .removeValue().addOnCompleteListener { task -> if (task.isSuccessful) { firebaseUser?.uid.let { it1 -> FirebaseDatabase.getInstance().reference .child("Follow").child(user.getUID()) .child("Followers").child(it1.toString()) .removeValue().addOnCompleteListener { task -> if (task.isSuccessful) { } } } } } } } } } override fun getItemCount(): Int { return mUser.size } class ViewHolder(@NonNull itemView: View) : RecyclerView.ViewHolder(itemView){ var userNameTextView: TextView = itemView.findViewById(R.id.user_name_search) var userFullNameTextView: TextView = itemView.findViewById(R.id.user_full_name_search) var userProfileImage: CircleImageView = itemView.findViewById(R.id.user_profile_image_search) var followButton: Button = itemView.findViewById(R.id.follow_btn_search) } private fun checkFollowingStatus(uid: String, followButton: Button) { val followingRef = firebaseUser?.uid.let { it1 -> FirebaseDatabase.getInstance().reference .child("Follow").child(it1.toString()) .child("Following") } followingRef.addValueEventListener(object : ValueEventListener{ override fun onDataChange(datasnapshot: DataSnapshot) { if (datasnapshot.child(uid).exists()) { followButton.text = "Following" } else { followButton.text = "Follow" } } override fun onCancelled(error: DatabaseError) { } }) } private fun addNotification(userId: String) { val notiRef = FirebaseDatabase.getInstance() .reference.child("Notifications") .child(userId) val notiMap = HashMap<String, Any>() notiMap["userid"] = firebaseUser!!.uid notiMap["text"] = "started following you" notiMap["postid"] = "" notiMap["ispost"] = false notiRef.push().setValue(notiMap) } }
Что я уже пробовал:
есть какая - нибудь помощь по этому поводу? есть предложения ?