繁体   English   中英

RecyclerView:未连接适配器; 设置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.

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