【问题标题】:Kotlin Retrofit response.body() returned null on arrayListKotlin Retrofit response.body() 在 arrayList 上返回 null
【发布时间】:2021-04-17 06:33:00
【问题描述】:

我已经设置了一些 API 数据以显示在我的 Android APP 上

[
  {"attendanceID":1,"userID":1,"date":"14 Apr","clock_in":"10:11","clock_out":"19:39","noted":"Weekday"},
  {"attendanceID":2,"userID":1,"date":"15 Apr","clock_in":"23:09","clock_out":"N.A.","noted":"Weekday"},
  {"attendanceID":3,"userID":1,"date":"16 Apr","clock_in":"19:19 ","clock_out":"19:42 ","noted":"Weekday"}
]

我的数据模型是这样的

data class Attendance (
    val userID: Int,
    val date: String?,
    val clock_in: String?,
    val clock_out: String?,
    val noted: String?
    )

界面是这样的

interface INodeJS {
  @GET("load_attendance")
  fun loadAttendance(): Call<ArrayList<Attendance>>
}

我的代码是这样的

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.absensi.ui.retrofit.INodeJS
import com.example.absensi.ui.retrofit.RetrofitClient
import kotlinx.android.synthetic.main.activity_detail_absensi.*
import retrofit2.Call
import retrofit2.Callback import retrofit2.Response

class DetailAbsensi : AppCompatActivity() {

lateinit var myAPI : INodeJS
private val attendanceList = ArrayList<Attendance>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_detail_absensi)

    val retrofit = RetrofitClient.instance
    myAPI = retrofit.create(INodeJS::class.java)
    rvAttendance.setHasFixedSize(true)
    rvAttendance.layoutManager = LinearLayoutManager(this)

    myAPI.loadAttendance().enqueue(object : Callback<ArrayList<Attendance>> {
        override fun onResponse(
                call: Call<ArrayList<Attendance>>,
                response: Response<ArrayList<Attendance>>
        ) {
            attendanceList.addAll(response.body()!!)
            val adapter = AttendanceAdapter(attendanceList)
            rvAttendance.adapter = adapter
        }

        override fun onFailure(call: Call<ArrayList<Attendance>>, t: Throwable) {
        }

    })

}

}

但是当我打开 DetailAbsensi 时,我总是会收到此错误

E/RecyclerView:没有附加适配器;跳过布局

所以在检查我的代码几个小时后,我发现在运行代码 myAPI.loadAttendance().enqueue 时,我在检查 response.body() 时得到的响应都是空的

[
  Attendance{userID=0,date="Null",clockin="Null",clockout="Null",noted="Noted"},
  Attendance{userID=0,date="Null",clockin="Null",clockout="Null",noted="Noted"},
  Attendance{userID=0,date="Null",clockin="Null",clockout="Null",noted="Noted"}
]

【问题讨论】:

    标签: android kotlin arraylist retrofit2


    【解决方案1】:

    你需要在对象的每个属性上添加这个

    data class Attendance (
    @SerializedName("userID")
    val userID: Int,
    @SerializedName("date")
    val date: String?,
    @SerializedName("clock_in")
    val clock_in: String?,
    @SerializedName("clock_out")
    val clock_out: String?,
    @SerializedName("noted")
    val noted: String?
    )
    

    您的问题已解决。

    【讨论】:

      【解决方案2】:

      您能否确保您是从延迟异步回调外部的“主”线程调用这些语句(例如在 onCreate() 方法内部)。一旦我从“延迟”方法中调用相同的语句。在我的情况下,一个 ResultCallback,我得到了同样的消息。

      在我的 Fragment 中,从 ResultCallback 方法内部调用以下代码会产生相同的消息。将代码移动到我的应用程序中的 onConnected() 方法后,消息消失了...

      LinearLayoutManager llm = new LinearLayoutManager(this);
      llm.setOrientation(LinearLayoutManager.VERTICAL);
      list.setLayoutManager(llm);
      list.setAdapter( adapter );
      

      【讨论】:

        【解决方案3】:

        将此代码添加到您的 activity.xml 文件中。
        在回收站视图中:

          app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-11
          • 2017-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多