我已经试了好几个星期了。我有一个显示通知的片段。但当我点击通知时,我的应用程序崩溃了。它指向Picasso.get().load(user!!.getImage()).placeholder(R.drawable.profile).into(imageView)
下方的线
它说:java.lang.IollegalArgumentException:路径不能为空
从logcat,使用picasso似乎是个问题,但我是编程新手,我不知道该做什么。请帮助我。谢谢
以下是我的notificationAdapter 的完整代码
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(mContext).inflate(R.layout.notifications_item_layout , parent,false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val notification = mNotification[position]
if(notification.getText().equals("Admirers you")){
holder.text.text = "Admirers you"
}
else if(notification.getText().equals("Liked your post")){
holder.text.text = "Liked your post"
}
else if (notification.getText().contains("commented:")){
holder.text.text = notification.getText().replace("commented:", "commented: ")
}
else{
holder.text.text = notification.getText()
}
userInfo(holder.profileImage, holder.fullname, notification.getUserId())
if(notification.isIsPost()){
holder.postImage.visibility = View.VISIBLE
getPostImage(holder.postImage, notification.getPostId())
}
else{
holder.postImage.visibility = View.GONE
}
holder.itemView.setOnClickListener {
if(notification.isIsPost()){
val editor = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit()
editor.putString("postId", notification.getPostId())
editor.apply()
(mContext as FragmentActivity).getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, PostDetailsFragment()).commit()
}
else{
val editor = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit()
editor.putString("profileId", notification.getUserId())
editor.apply()
(mContext as FragmentActivity).getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, ProfileFragment()).commit()
}
}
}
override fun getItemCount(): Int {
return mNotification.size
}
inner class ViewHolder(@NonNull itemView: View) : RecyclerView.ViewHolder(itemView)
{
var postImage: ImageView
var profileImage : CircleImageView
var fullname : TextView
var text : TextView
init {
postImage = itemView.findViewById(R.id.notification_post_image)
profileImage = itemView.findViewById(R.id.notifications_profile_image)
fullname = itemView.findViewById(R.id.fullname_notification)
text = itemView.findViewById(R.id.comment_notification)
}
}
private fun userInfo(imageView: ImageView, fullname: 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::class.java)
Picasso.get().load(user!!.getImage()).placeholder(R.drawable.profile).into(imageView)
fullname.text = user.getfullname()
}
}
override fun onCancelled(p0: DatabaseError) {
}
})
}
private fun getPostImage(imageView: ImageView, postID:String)
{
val postRef =
FirebaseDatabase.getInstance()
.reference.child("Posts")
.child(postID)
postRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(p0: DataSnapshot)
{
if (p0.exists()) {
val post = p0.getValue<Post>(Post::class.java)
Picasso.get().load(post!!.getpostimage()).placeholder(R.drawable.profile)
.into(imageView)
}
}
override fun onCancelled(p0: DatabaseError) {
}
})
}
}
还有我的通知片段
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="Fragments.NotificationsFragment">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/app_bar_layout_notifications"
android:background="@color/white">
<androidx.appcompat.widget.Toolbar
android:id="@+id/notifications_toolbar"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="4dp"
android:layout_marginLeft="6dp"
android:layout_marginRight="6dp"
android:background="@android:color/white">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notifications"
android:textSize="18sp"
android:maxLines="1"
android:textStyle="bold"
android:textColor="@android:color/black"
android:layout_centerVertical="true"/>
</RelativeLayout>
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_notifications"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:layout_below="@+id/app_bar_layout_notifications">
</androidx.recyclerview.widget.RecyclerView>
如果你需要更多信息,这里是我的通知项目布局。谢谢
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="6dp">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/notifications_profile_image"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/profile">
</de.hdodenhof.circleimageview.CircleImageView>
<LinearLayout
android:layout_toEndOf="@+id/notifications_profile_image"
android:layout_toStartOf="@+id/notification_post_image"
android:layout_centerVertical="true"
android:layout_marginStart="5dp"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/fullname_notification"
android:textStyle="bold"
android:textColor="@color/teal_200"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:id="@+id/comment_notification"
android:textStyle="bold"
android:textColor="@color/teal_200"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
<ImageView
android:id="@+id/notification_post_image"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_alignParentEnd="true">
</ImageView>
我不认识毕加索,所以我不能告诉你问题出在哪里*。(我甚至不知道安卓系统,我想这是为了它。(但由于你是编程新手,在我看来,你需要知道的是如何自己找出问题——如何调试——所以这里有一些提示,我希望会有所帮助。
你从日志开始做了正确的事情;如果堆栈跟踪出现异常,那么这总是有助于缩小问题范围。但您的案例还没有将其缩小到足够的范围,因为这一行正在做许多不同的事情。因此,最简单的方法是将该行拆分,然后堆栈跟踪的行号会更精细地缩小它的范围。
你可以简单地换行,例如:
Picasso.get()
.load(user!!.getImage())
.placeholder(R.drawable.profile)
.into(imageView)
然后,您将能够判断哪些主要操作触发了异常。(当然,给出异常的操作可能不是你需要更改的操作,但无论哪种方式,你都需要了解问题,然后才能修复它。(
如果这还不够,那么你可以采取几种方法。但我通常会放弃的是最普遍的:日志记录。无论你是在使用桌面应用程序、移动应用程序、网络应用程序、微服务、独立应用程序,还是其他什么,几乎总是有一种方法可以打印出一些文本,让你可以在屏幕或文件中看到它。正如我所说,我不了解安卓系统,但这个问题似乎表明了你如何做到这一点;在其他环境中,您可能使用几个日志库中的一个(java.util.logging、log4j…(,或者只使用基本的println()
。但是,无论你怎么做,都会有一种方法可以看到一些中间值——,并且在调试时,能够看到发生了什么总是很有价值的。
你可以试着打印出用户(或者,如果没有简单的字符串表示,他们的名字或其他可能给你线索的东西(。然后是图像,同上。load()
调用的结果。等等当然,这意味着对代码进行一点重组,例如:
val picasso = Picasso.get()
println("picasso = $picasso")
println("user = $user")
val image = user!!.getImage()
println("image = $image")
val loaded = picasso.load(image)
println("loaded = $loaded")
println("profile = ${R.drawable.profile}")
val placeholder = loaded.placeholder(R.drawable.profile)
println("placeholder = $placeholder")
println("imageView = $imageView")
placeholder.into(imageView)
(在您的情况下,替换任何有效的日志记录方法。当然,我在这里做得太过火了。但我希望你能明白。(
为了记录在案,Kotlin的also()
提供了一种实现上述操作的方法,而不必命名所有临时变量,也不必拆分调用链:
Picasso.get()
.also{ println("picasso = $it") }
.also{ println("user = $user") }
.load(user!!.getImage().also{ println("image = $it") } )
.also{ println("loaded = $it") }
.placeholder(R.drawable.profile.also{ println("profile = $it") })
.also{ println("placeholder = $it") }
.into(imageView.also{ println("imageView = $it") })
然而,这可能会很快变得笨拙,所以我通常不会推荐它
无论哪种方式,你打印出来的值中很可能有一个不是你所期望的,或者你能够发现一些看起来不对劲的东西,这将为你提供足够的信息来识别问题——或者至少,将你的注意力转移到代码的其他部分,然后你可以用同样的方式调试这些部分。
一旦解决了问题并且代码的行为符合预期,就可以删除日志记录。然而,通常最好保留一些日志记录代码。(尤其是如果您使用的日志库可以设置不同的级别,因此您可以在通常看不到的较低级别进行日志记录。(然后,当你需要追踪代码中的其他问题时,更容易看到发生了什么
(*从异常消息中,我怀疑user!!.getImage()
部分有问题。但这只是一个盲目的猜测。(