![](/img/trans.png)
[英]RecyclerView Error No adapter attached ; skipping layout and setting OnClickListener
[英]RecyclerView: No adapter attached; skipping layout when setting onClickListener
当我尝试在ViewHolder中实现onClickListener时,RecyclerView似乎停止工作。 我不知道为什么。
我尝试使用runOnUiThread设置适配器。 我也曾尝试在onCreate中将适配器设置为null,但是这些解决方案似乎都不起作用。
我已经看过其他栈溢出问题类似的问题,但是找不到正确的解决方案来使其正常工作。
MainActivity.kt
package com.example.eijaz.popularmovies
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import java.io.IOException
import android.support.v7.widget.LinearLayoutManager
import com.google.gson.GsonBuilder
import android.support.v7.widget.GridLayoutManager
import android.support.v7.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*
import okhttp3.*
import java.util.logging.Logger.global
class MainActivity : AppCompatActivity() {
val URL_MAIN = "http://api.themoviedb.org/3"
val POPULAR_MOVIES = "/movie/popular"
val TOP_RATED_MOVIES = "movie/top_rated"
val URL_INDIVIDUAL_MOVIE = "http://image.tmdb.org/t/p/"
val POSTER_SIZE = "w185"
val ENTER_API_KEY = "?api_key="
val API_KEY = "67bfdc871eabed5845200d39e64ed6e5"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fetchJson()
rv_poster_list.layoutManager = GridLayoutManager(this, 2)
}
fun fetchJson() {
println("Attempting to Fetch JSON")
val request = Request.Builder().url(URL_MAIN + POPULAR_MOVIES + ENTER_API_KEY + API_KEY).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback {
override fun onResponse(call: Call?, response: Response?) {
val body = response?.body()?.string()
println(body)
val gson = GsonBuilder().create()
val homeFeed = gson.fromJson(body, HomeFeed::class.java)
runOnUiThread {
rv_poster_list.adapter = MovieAdapter(homeFeed)
}
}
override fun onFailure(call: Call?, e: IOException?) {
println("Failed to execute request")
}
})
}
}
ackage com.example.eijaz.popularmovies
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import java.io.IOException
import android.support.v7.widget.LinearLayoutManager
import com.google.gson.GsonBuilder
import android.support.v7.widget.GridLayoutManager
import android.support.v7.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*
import okhttp3.*
import java.util.logging.Logger.global
class MainActivity : AppCompatActivity() {
val URL_MAIN = "http://api.themoviedb.org/3"
val POPULAR_MOVIES = "/movie/popular"
val TOP_RATED_MOVIES = "movie/top_rated"
val URL_INDIVIDUAL_MOVIE = "http://image.tmdb.org/t/p/"
val POSTER_SIZE = "w185"
val ENTER_API_KEY = "?api_key="
val API_KEY = "67bfdc871eabed5845200d39e64ed6e5"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fetchJson()
rv_poster_list.layoutManager = GridLayoutManager(this, 2)
}
fun fetchJson() {
println("Attempting to Fetch JSON")
val request = Request.Builder().url(URL_MAIN + POPULAR_MOVIES + ENTER_API_KEY + API_KEY).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback {
override fun onResponse(call: Call?, response: Response?) {
val body = response?.body()?.string()
println(body)
val gson = GsonBuilder().create()
val homeFeed = gson.fromJson(body, HomeFeed::class.java)
runOnUiThread {
rv_poster_list.adapter = MovieAdapter(homeFeed)
}
}
override fun onFailure(call: Call?, e: IOException?) {
println("Failed to execute request")
}
})
}
}
MovieAdapter.kt
package com.example.eijaz.popularmovies
import android.content.Intent
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.poster_list_item.view.*
class MovieAdapter(val homeFeed: HomeFeed) : RecyclerView.Adapter<CustomViewHolder>() {
val URL_MAIN = "http://api.themoviedb.org/3"
val POPULAR_MOVIES = "/movie/popular"
val TOP_RATED_MOVIES = "movie/top_rated"
val URL_INDIVIDUAL_MOVIE = "http://image.tmdb.org/t/p/"
val POSTER_SIZE = "w185"
val ENTER_API_KEY = "?api_key="
val API_KEY = "67bfdc871eabed5845200d39e64ed6e5"
override fun getItemCount(): Int {
return homeFeed.results.count()
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): CustomViewHolder {
val layoutInflater = LayoutInflater.from(parent?.context)
val cellForRow = layoutInflater.inflate(R.layout.poster_list_item, parent, false)
return CustomViewHolder(cellForRow)
}
override fun onBindViewHolder(holder: CustomViewHolder?, position: Int) {
val posterPath = homeFeed.results.get(position).poster_path
val posterUrl = URL_INDIVIDUAL_MOVIE + POSTER_SIZE + posterPath
val ivMoviePoster = holder?.view?.iv_movie_poster
Picasso.with(holder?.view?.context).load(posterUrl).into(ivMoviePoster)
}
}
class CustomViewHolder(val view: View): RecyclerView.ViewHolder(view) {
init {
view.setOnClickListener {
val intent = Intent(view.context, DetailActivity::class.java)
view.context.startActivity(intent)
}
}
}
这不是因为onClickListener
。 这是因为您最初没有连接适配器。 您需要做的是在onCreate
方法中附加一个空适配器MovieAdapter
,然后在获取数据之后,可以在适配器中设置数据并调用notifydatasetchanged
。 因此,类似rv_poster_list.adapter = MovieAdapter(Homefeed())
的数据,然后将数据加载到fetchJson()
您可以调用rv_poster_list.adapter.homefeed = <data>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.