简体   繁体   中英

Java/Kotlin. No adapter attached; skipping layout. I dont know why i have this error

I Have NetworkRecycler class.I just want to show data to my textviews from server. I use retrofit library. In log i have error message: No adapter attached; skipping layout. Sorry for me English guys. This is my MainActivity class:

class MainActivity : AppCompatActivity() {

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

    val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
    val linearLayoutManager = LinearLayoutManager(this)
    linearLayoutManager.orientation = LinearLayoutManager.VERTICAL

    val retrofit = Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl("https://developers.themoviedb.org/")
        .build()

    val json = retrofit.create(JsonPlaceHolder::class.java)
    val call = json.getNetworkId(3)

    call.enqueue(object: Callback<List<Network>> {

        override fun onResponse(call: Call<List<Network>>, response: Response<List<Network>>) {
            val network = response.body()
            val networkRecycler = NetworkRecycler(network!!)

            recyclerView.apply {
                layoutManager = linearLayoutManager
                adapter = networkRecycler
            }
        }

        override fun onFailure(call: Call<List<Network>>, t: Throwable) {
            Log.e("MainActivity", "${t.message}")
        }
    })
}

And this is my NetworkRecycler class:

class NetworkRecycler(private val list: List<Network>): RecyclerView.Adapter<NetworkRecycler.ViewHolder(){

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

    val view = LayoutInflater.from(parent.context).inflate(R.layout.recycler_list, parent, false)
    return ViewHolder(view)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val network = list[position]

    holder.headquarters.text = network.headquarters
    holder.homepage.text = network.homepage
    holder.id.text = network.id.toString()
    holder.name.text = network.name
    holder.originCountry.text = network.origin_country
}

override fun getItemCount(): Int = list.size

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val headquarters : TextView = itemView.findViewById(R.id.headquarters)
    val homepage : TextView = itemView.findViewById(R.id.homepage)
    val id : TextView = itemView.findViewById(R.id.textId)
    val name : TextView = itemView.findViewById(R.id.name)
    val originCountry : TextView = itemView.findViewById(R.id.origin_country)
}

}

Finally my Network class:

data class Network(
    val headquarters: String,
    val homepage: String,
    val id: Int,
    val name: String,
    val origin_country: String
)

You need to set your recyclerView with adapter first, then change the adapter when get the response. This code below may be work.

//define adapter with empty list
var networkRecycler = NetworkRecycler(ArrayList<Network>())
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
    val linearLayoutManager = LinearLayoutManager(this)
    linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
    //set your adapter here
    recyclerView.apply {
                layoutManager = linearLayoutManager
                adapter = networkRecycler
            }
    val retrofit = Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl("https://developers.themoviedb.org/")
        .build()

    val json = retrofit.create(JsonPlaceHolder::class.java)
    val call = json.getNetworkId(3)

    call.enqueue(object: Callback<List<Network>> {

        override fun onResponse(call: Call<List<Network>>, response: Response<List<Network>>) {
            val network = response.body()
            networkRecycler = NetworkRecycler(network!!)
            
            //refresh recycler view
            adapter.notifyDataSetChanged();


        }

        override fun onFailure(call: Call<List<Network>>, t: Throwable) {
            Log.e("MainActivity", "${t.message}")
        }
    })
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM