如何使用Retrofit2 API在RecyclerView中显示数据?

首先,我是Android / Java / Kotlin开发的新手。 我正在使用Retrofit2从Udacity API检索数据。 我可以看到Logcat中的响应,但是当我尝试在RecyclerView中显示时,只有一个空白屏幕。 我认为错误是在MainActivity中,但我仍然无能,需要帮助。

我的模型类

class Course(var title: String, var subtitle: String, var key: String, var instructors: List, var expected_learning: String, var required_knowledge: String) class Instructor(var name: String, var bio: String) 

我的界面

 interface ApiServiceInterface { @GET("courses") fun list() : Call } 

我的适配器

 class CourseAdapter(val listCourses: ArrayList, val context: Context) : RecyclerView.Adapter() { class CourseViewHolder(viewItem: View) : RecyclerView.ViewHolder(viewItem) { val courseTitle = viewItem.findViewById(R.id.tv_title) as TextView val courseSubtitle = viewItem.findViewById(R.id.tv_subtitle) as TextView val courseKey = viewItem.findViewById(R.id.tv_course_key) as TextView val instructorName = viewItem.findViewById(R.id.tv_instructor_name) as TextView } override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): CourseViewHolder { val viewHolder = LayoutInflater.from(parent?.context).inflate(R.layout.activity_item_list, parent, false) val itemViewHolder = CourseViewHolder(viewHolder) return itemViewHolder } override fun onBindViewHolder(holder: CourseViewHolder?, position: Int) { holder?.courseTitle?.text = listCourses[position].title holder?.courseSubtitle?.text = listCourses[position].subtitle holder?.courseKey?.text = listCourses[position].key holder?.instructorName?.text = listCourses[position].instructors.toString() } override fun getItemCount(): Int = listCourses.size } 

我的主要活动 – 我认为错误在这里,但我还没有弄清楚

 class MainActivity : AppCompatActivity() { internal val TAG = "Testing Retrofit2 API" lateinit var mRecyclerView: RecyclerView lateinit var mCourseAdapter: RecyclerView.Adapter val listCourse = arrayListOf() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main_recyclerview) mRecyclerView = findViewById(R.id.id_recycler_view) as RecyclerView val mLayoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) mRecyclerView.layoutManager = mLayoutManager mRecyclerView.setHasFixedSize(true) mCourseAdapter = CourseAdapter(listCourse, applicationContext) mRecyclerView.adapter = mCourseAdapter mCourseAdapter.notifyDataSetChanged() val call = RetrofitInitializer().createService().list() call.enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { response.body() if (!response.isSuccessful) { Log.i(TAG, "[ ERROR ] " + response.code()) } else { if (listCourse.isEmpty()) { Toast.makeText(applicationContext, "Empty list!", Toast.LENGTH_LONG).show() } else { Toast.makeText(applicationContext, "Full list!", Toast.LENGTH_LONG).show() } val catalog = response.body() for (c in catalog!!.courses!!) { Log.i(TAG, String.format("%s: %s", c.title, c.subtitle, c.key, c.required_knowledge, c.expected_learning)) for (i in c.instructors!!) { Log.i(TAG, i.name) } Log.i(TAG, "\n****************************************************************************************************\n") } } } override fun onFailure(call: Call?, t: Throwable?) { Log.d(TAG, "onFailure() : " + t?.message) } }) } } 

Retrofit实例的初始化程序类

 class RetrofitInitializer { companion object Factory { val BASE_URL = "https://www.udacity.com/public-api/v0/" } private val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build() fun createService(): ApiServiceInterface = retrofit.create(ApiServiceInterface::class.java) } 

我的RecyclerView xml文件

      

我的CardView xml文件

           

您的活动中有一个空的课程列表( listCourse )。 您通过它的构造函数将空列表传递给适配器。 即使你读了这些课程,那个清单仍然是空的。 所以适配器/ RecyclerView保持空白。

获取课程后,尝试创建适配器

  mCourseAdapter = CourseAdapter(catalog!!.courses!!, applicationContext) 

或者在你的适配器中有一个课程属性

 YourAdapter(...) { var courses = listOf(Course) } 

然后在你的Activity (取得课程后):

 adapter.courses = catalog!!.courses!! adapter.notifyDataSetChanged()