java - 为什么我的适配器不工作?如何解决 NullPointerException 错误?
问题描述
我正在构建一个新闻应用程序。我收到 Kotlin 空指针异常错误。我已经制作了频道名称列表,点击它会显示来自这些频道来源的不同新闻,但是当我点击其中一个新闻频道时,它会崩溃。谁能帮我写代码?这是它显示的错误:
FATAL EXCEPTION: main
Process: com.example.newswrld, PID: 16135
kotlin.KotlinNullPointerException
at com.example.newswrld.Adapter.ViewHolder.ListNewsAdapter.onBindViewHolder(ListNewsAdapter.kt:47)
at com.example.newswrld.Adapter.ViewHolder.ListNewsAdapter.onBindViewHolder(ListNewsAdapter.kt:16)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:20672)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
at android.view.View.layout(View.java:20672)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at androidx.swiperefreshlayout.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:625)
at android.view.View.layout(View.java:20672)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20672)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
at android.view.View.layout(View.java:20672)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20672)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
at android.view.View.layout(View.java:20672)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
at android.view.View.layout(View.java:20672)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2792)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2319)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:696)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
2020-06-05 18:05:23.297 16135-16135/com.example.newswrld E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
这是 ListNewsAdapter.kt:
package com.example.newswrld.Adapter.ViewHolder
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.newswrld.Common.ISO8601Parser
import com.example.newswrld.Interface.ItemClickListener
import com.example.newswrld.Model.Article
import com.example.newswrld.R
import com.squareup.picasso.Picasso
import java.text.ParseException
import java.util.*
class ListNewsAdapter(val articleList:MutableList<Article>, private val context: Context):RecyclerView.Adapter<ListNewsViewHolder>(){
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListNewsViewHolder {
val inflater=LayoutInflater.from(parent!!.context)
val itemView=inflater.inflate(R.layout.news_layout,parent,false)
return ListNewsViewHolder(itemView)
}
override fun getItemCount(): Int {
return articleList.size
}
override fun onBindViewHolder(holder: ListNewsViewHolder, position: Int) {
Picasso.with(context)
.load(articleList[position].urlToImage)
.into(holder.article_image)
if(articleList[position].title!!.length > 65){
holder.article_title.text=articleList[position].title!!.substring(0,65)+"..."
}
else{
holder.article_title.text=articleList[position].title!!
}
if(articleList[position].publishedAt!=null){
var date: Date?=null
try {
date=ISO8601Parser.parse(articleList[position].publishedAt!!)
}catch (ex:ParseException)
{
ex.printStackTrace()
}
holder.article_time.setReferenceTime(date!!.time)
}
holder.setItemClickListener(object :ItemClickListener{
override fun onClick(view: View, position: Int) {
}
})
}
}
解决方案
通常 KotlinNullPointerException 原因!操作员。您的文章模型 ( https://github.com/xSankeTx/NewsWRLD/blob/master/app/src/main/java/com/example/newswrld/Model/Article.kt ) 的所有属性都声明为可为空。尝试使用?.let {}
如下函数处理所有可为空的属性:
article.title?.let {
// Use title safely by `it`
}
运营商!!在大多数情况下应该避免。
推荐阅读
- xamarin.forms - 带有圆形中央按钮的 Xamarin Forms 导航栏
- python - 是否有一种可接受的 Pythonic 方式将基类部分与子类对象分离?
- django - 如果在 django rest 框架中不存在,则自动在反向外部表中创建项目
- python-3.x - Django NoReverseMatch:找不到“条目”的反向。“登录”不是有效的视图函数或模式
- liquibase - liquibase 中的约束
- java - 无法启动 logbox,因为 react 无法在 Google Pixel 8.0 中创建根视图
- python - 使用while退出for循环
- snowflake-cloud-data-platform - 如何在存储过程中实现执行流程并获得表输出
- html - 替换文件中特定行号的字符
- javascript - Firebase 存储 onUpload 不正确的路径名