我正在使用此应用来显示流行电影。我收到此日志:“ /结果:retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall@9daee07”。我已完成所有工作,但在RecyclerView中没有任何结果。我不知道如何显示获取的数据。这是网址:http://api.themoviedb.org/3/movie/popular?api_key=api_key_goes_here。
MovieResponse.kt
data class MovieResponse(
val page: Int,
val results: List<Movie>,
@SerializedName("total_pages") val totalPages: Int,
@SerializedName("total_results") val totalResults: Int
)
Movie.kt
data class Movie(
val id: Int,
val overview: String,
val popularity: Double,
@SerializedName("poster_path") val posterPath: String,
@SerializedName("release_date") val releaseDate: String,
val title: String,
@SerializedName("vote_average") val voteAverage: Double
)
MainAdapter.kt
package com.example.sloomena.ui
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.sloomena.R
import com.example.sloomena.data.MovieResponse
import kotlinx.android.synthetic.main.movie_details_row.view.*
class MainAdapter: RecyclerView.Adapter<CustomHolder>(){
val movies: MutableList<MovieResponse> = mutableListOf()
fun refreshData(newResults: List<MovieResponse>) {
movies.clear()
movies.addAll(newResults)
notifyDataSetChanged()
}
override fun getItemCount(): Int {
return movies.size
}
override fun onBindViewHolder(holder: CustomHolder, position: Int) {
holder.bind(movies.get(position))
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomHolder {
val layoutInflater = LayoutInflater.from(parent?.context)
val cellForRow = layoutInflater.inflate(R.layout.movie_details_row, parent, false)
return CustomHolder(cellForRow)
}
}
class CustomHolder(itemView: View): RecyclerView.ViewHolder(itemView){
fun bind(movie: MovieResponse) {
itemView.title.text = movie.results.toString()
}
}
thmdbAPI.kt
interface tmdbAPI {
@GET("movie/popular")
fun getPopularMovies(
@Query("api_key") api_key: String
): Call<List<MovieResponse>>
}
Networking.kt
const val BASE_URL = "http://api.themoviedb.org/3/"
object Networking{
val showSearchService: tmdbAPI = Builder()
.addConverterFactory(ConverterFactory.converterFactory)
.client(HttpClient.client)
.baseUrl(BASE_URL)
.build()
.create(tmdbAPI::class.java)
}
object ConverterFactory{
val converterFactory = GsonConverterFactory.create()
}
object HttpClient{
val client = OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.build()
}
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setUpUi()
findMovies()
}
private fun setUpUi() {
id_recyclerview.layoutManager = LinearLayoutManager(this)
id_recyclerview.adapter = MainAdapter()
}
private fun findMovies() {
GlobalScope.launch(Dispatchers.Main) {
val results = Networking.showSearchService.getPopularMovies("api_key_goes_here")
Log.d("results", results.toString())
}}
}
在我的movie_details_row.xml中(id_picture_movie,id_movie_realise_date和标题)。 另外,我不知道如何在MovieResponse的List(Movie)中获取属性。
答案 0 :(得分:0)
设置完recyclerview后,您实际上并没有传递任何要显示的项目。因此,您要做的就是进行设置,发送网络请求,然后对这些数据不执行任何操作。
val mainAdapter = MainAdapter()
...
private fun findMovies() {
GlobalScope.launch(Dispatchers.Main) {
val results = Networking.showSearchService.getPopularMovies("0b0e8d104f0d6130a4fc67848f89e107")
Log.d("results", results.toString())
//Assuming you're returning a list
mainAdapter.refreshData(results)
}}
}
答案 1 :(得分:0)
1)如果我是您,我将编辑您的帖子以排除您的API密钥。回应一下并粘贴到Pastebin之类的网站上。将来,请尝试粘贴错误的堆栈跟踪记录,并使它的答案变得更加轻松。
2)在您的响应数据类中,您可能需要使用-Djava.library.path
作为其他值。自从我使用Gson作为解串器以来已经有一段时间了,所以也许那是不正确的。这可能是“此外,我不知道如何在MovieResponse内部的List(Movie)中获取属性的原因。”
3)您的API服务的返回类型错误。以下是API调用格式的结果:https://pastebin.com/TQb0YSty。您可以看到返回类型不是列表,它是单个JSON对象。因此,您的返回类型java -Djava.library.path=./MyJar.jar/library -jar MyJar.jar
应该为java -Djava.library.path=pathTo/LibraryInMyJar -jar MyJar.jar
。这可能是导致@SerializedName
错误的原因。
可能还有其他问题,但是那些事情立即让我脱颖而出