试图在Kotlin中创建一个简单的recyclerView,但是适配器没有正确应用

我试图在Kotlin中创建一个简单的recyclerView,通过我通过Volley得到的数据(我已经确认返回了正确的数据),我一直运行到错误E/RecyclerView: No adapter attached; skipping layout 实际上我已经用我创建的自定义适配器类指定了一个适配器。

 class ImageAdapter(var c: Context, var list: ArrayList<Image>) : RecyclerView.Adapter<ImageAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder? { val layoutInflater = LayoutInflater.from(parent.context) return ViewHolder(layoutInflater.inflate(R.layout.image_cardview, parent, false)) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val imageUrl = list[position].url val submitter = list[position].submitter val color = list[position].color holder.submitterTV.text = submitter holder.card.setCardBackgroundColor(Color.parseColor(color)) } override fun getItemCount() = list.size class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){ val card = itemView.card val submitterTV = itemView.submitter val imageView = itemView.image } } 

这是我的MainActivty类,在那里我做了实际的JSON调用,并试图将我的适配器与我创建的ArrayList连接:

 class MainActivity : AppCompatActivity() { val images = ArrayList<Image>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) imageList.layoutManager = LinearLayoutManager(applicationContext) request("https://api.unsplash.com/photos/curated/?client_id=API_KEY") imageList.adapter = ImageAdapter(applicationContext, images) } private fun request(url: String) { val queue = Volley.newRequestQueue(this) val stringRequest = JsonArrayRequest(url, Response.Listener<JSONArray> { response -> try { for (i in 0..(response.length() - 1)) { val image: Image = Image(response.getJSONObject(i).getJSONObject("urls").getString("full"), response.getJSONObject(i).getJSONObject("user").getString("username"), response.getJSONObject(i).getString("color")) images.add(image) } imageList.adapter.notifyDataSetChanged() } catch (e: JSONException) { e.printStackTrace() } }, Response.ErrorListener { }) queue.add(stringRequest) } } 

我创建了一个自定义的数据类Image来存储三个字段:imageUrl,提交者和颜色,所有这些都是从JSON派生的。 我认为在请求完成后调用适配器上的notifyDataSetChanged()将允许recyclerView得到更新并显示这些项目,但屏幕上什么也没有显示出来。 有没有人有任何想法,我在哪里搞砸了?

你可以从这里下载源代码( Kotlin Android中的Recyclerview )

MainActivity.kt:

 package com.deepshikha.recyclerviewkotlin import android.app.Activity import android.os.Bundle import android.support.v7.widget.LinearLayoutManager import android.view.Window import android.view.WindowManager import android.widget.LinearLayout import kotlinx.android.synthetic.main.activity_main.* import net.simplifiedcoding.recyclerviewexample.CustomAdapter class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requestWindowFeature(Window.FEATURE_NO_TITLE) window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) setContentView(R.layout.activity_main) val users = ArrayList<Model_Details>() users.add(Model_Details("Kaju katli", "Kaju katli, also known as kaju Katari or kaju barfi, is an Indian dessert similar to a barfi.",R.drawable.kaju)) users.add(Model_Details("Doughnut", "The doughnut is popular in many countries and prepared in various forms as a sweet snack that can be homemade or purchased in bakeries, supermarkets, food stalls, and franchised specialty outlets",R.drawable.donuts)) users.add(Model_Details("Panna cotta", "Panna cotta is an Italian dessert of sweetened cream thickened with gelatin and molded. The cream may be aromatized with rum, coffee, vanilla, or other flavorings.",R.drawable.panna_cotta)) users.add(Model_Details("Rose Cookies", "Rose cooky is a famous South Indian snack made during festivals",R.drawable.rosecookies)) users.add(Model_Details("Belgian waffle", "In North America, Belgian waffles are a variety of waffle with a lighter batter, larger squares, and deeper pockets than ordinary American waffles",R.drawable.belgianwaffle)) val obj_adapter = CustomAdapter(users) recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false) recyclerView.adapter = obj_adapter } } 

CustomAdapter.kt:

 package net.simplifiedcoding.recyclerviewexample import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import com.deepshikha.recyclerviewkotlin.Model_Details import com.deepshikha.recyclerviewkotlin.R import kotlinx.android.synthetic.main.adapter_details.view.* class CustomAdapter(val userList: ArrayList<Model_Details>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() { //this method is returning the view for each item in the list override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.ViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.adapter_details, parent, false) return ViewHolder(v) } //this method is binding the data on the list override fun onBindViewHolder(holder: CustomAdapter.ViewHolder, position: Int) { holder.bindItems(userList[position]) } //this method is giving the size of the list override fun getItemCount(): Int { return userList.size } //the class is hodling the list view class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bindItems(user: Model_Details) { itemView.tv_name.text=user.name itemView.tv_des.text=user.des itemView.iv_name.setImageResource(user.image) } } } 

谢谢!

看下面的例子,我想你可以给你想法。

你可以在这里得到例子: https : //github.com/Siddharha/RecyclerviewTest_Kotlin

主要活动

 class MainActivity : AppCompatActivity() { private var myAdapter: MyAdapter? = null private var arrayList: ArrayList<MyItem>? = null private var layoutManager: RecyclerView.LayoutManager? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) initialize() setupList() loaddata() } private fun loaddata() { for (i in 0..9) { val myItem = MyItem() myItem.name = "Sid_" + i myItem.number = "098899876" + i arrayList!!.add(myItem) } myAdapter!!.notifyDataSetChanged() } private fun setupList() { rlItems!!.layoutManager = layoutManager rlItems!!.adapter = myAdapter } private fun initialize() { arrayList = ArrayList<MyItem>() layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false) myAdapter = MyAdapter(arrayList!!, this, R.layout.item_cell) } 

}

适配器类

 internal class MyAdapter(private val arrayList: ArrayList<MyItem>, private val context: Context, private val layout: Int) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyAdapter.ViewHolder { val v = LayoutInflater.from(parent.context).inflate(layout, parent, false) return ViewHolder(v) } override fun onBindViewHolder(holder: MyAdapter.ViewHolder, position: Int) { holder.bindItems(arrayList[position]) } override fun getItemCount(): Int { return arrayList.size } internal inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bindItems(items: MyItem) { itemView.tvName.text = items.name itemView.tvNumber.text = items.number } } 

}

Item类

 internal class MyItem { var name: String? = null var number: String? = null 

}

尝试使用下面的代理适配器是参考链接。

参考链接: https : //android.jlelse.eu/keddit-part-4-recyclerview-delegate-adapters-data-classes-with-kotlin-9248f44327f7