Kotlin:如何显示数据?

时间:2019-08-20 16:48:30

标签: rest api kotlin

我正在使用此应用来显示流行电影。我收到此日志:“ /结果: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)中获取属性。

2 个答案:

答案 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错误的原因。

可能还有其他问题,但是那些事情立即让我脱颖而出