所以我已經和這個問題糾纏了好幾天,我需要一些幫助。我已經讓這段代碼在一個活動中作業了,但是當我把它移到一個片段中時,它就不作業了。兩者之間其他的東西都是一樣的。
在作業的活動中使用除錯器,該行
。apiService = retrofit.create<HomeJsonApiService> (HomeJsonApiService::class.java)
轉到getItemCount()。然而在片段中,它直接進入片段中的onCreateView。我在下面附上了我的代碼。謝謝你的幫助! 請溫柔點。我還是個新手 :)
首先是我的片段:
class TabHomeActivity : Fragment() {
val itemList = ArrayList<HomeCards> ()
lateinit var配接器。家庭卡配接器(HomeCardsAdapter
override fun onCreate(sedInstanceState: Bundle? ){
super.onCreate(s savedInstanceState)
var binding = FragmentTabHomeActivityBinding.inflate(layoutInflater)
配接器 = HomeCardsAdapter()
var rv = binding.rvHomeCards
rv.adapter = adapter
loadData()
}
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup? , savedInstanceState: Bundle?)。視圖? {
return inflater.inflate(R.layout.card_home, container, false)
}
override fun onViewCreated(view。View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
private fun loadData() {
ApiManager.getInstance().service.listHeroes()
.enqueue(object : Callback<ResponseData<List<HomeCards> >> {
override fun onResponse(
呼叫。Call<ResponseData<List<HomeCards>> 。
回應。Response< ResponseData< List< HomeCards>>
){
val listData: List<HomeCards> = response.body()!.data
//將資料從網路更新到配接器。
itemList.clear()
itemList.addAll(listData)
adapter.updateData(itemList)
adapter.notifyDataSetChanged()
}
override fun onFailure(呼叫。Call<ResponseData<List<HomeCards>> , t: Throwable) {
}
})
}
}
HTTP請求:
data class ResponseData < T> (
val代碼。Int,
val data: T
)
interface HomeJsonApiService{
@GET("marvel-heroes.asp?h=2")
fun listHeroes(): retrofit2.Call<ResponseData<List<HomeCards> > >
}
class ApiManager{
private var apiService。HomeJsonApiService? = null
init {
createService()
}
val service。HomeJsonApiService get() = apiService!
private fun createService() {
val loggingInterceptor =
HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {
override fun log(message: String){
Log.i("Retrofit", message)
}
})
loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
val client = OkHttpClient.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(30,TimeUnit.SECONDS)
.writeTimeout(30,TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
.build()
val retrofit: Retrofit = Retrofit.Builder()
.client(client)
.baseUrl("https://www.mywebsite.com/jsonfolder/JSON/")
.addConverterFactory(GsonConverterFactory.create())
.build()
apiService = retrofit.create(HomeJsonApiService::class.java)
}
companion object {
private var instance: ApiManager? = null 實體:ApiManager?
fun getInstance()。ApiManager {
return instance ? : synchronized(this) {
ApiManager().also { instance = it }
}
}
}
}
而我的配接器:
class HomeCardsAdapter() : RecyclerView.Adapter<HomeCardsAdapter.ViewHolder> () {
private lateinit var itemList: List<HomeCards>
lateinit var context: 語境
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)。ViewHolder {
context = parent.context
val view = LayoutInflater.from(context).inflate(R.layout.card_home, parent, false)
return ViewHolder(view)
}
override fun getItemCount(): Int {
return if ( ::itemList.isInitialized) itemList.size else 0
}
override fun onBindViewHolder( holder: ViewHolder, position: Int) {
holder.bind()
}
fun updateData(list: List<HomeCards>) {
itemList = list;
notifyDataSetChanged()
}
inner class ViewHolder( itemView: View) : RecyclerView.ViewHolder(itemView) {
//var binding = ActivityMainBinding(layoutInflater(inf))。
fun bind() {
val item = itemList.get(adapterPosition)
ViewHolder(itemView).itemView.findViewById<TextView>(R.id.cardHomeTitle).text = item.name
ViewHolder(itemView).itemView.findViewById<TextView> (R.id.cardHomeTitle).text = item.superheroName
Glide.with(context)
.load(item.photo)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.circleCrop()
.into(ViewHolder(itemView).itemView.findViewById<ImageView>(R.id.cardHomeIcon))
}
}
}
class HomeCards{
@SerializedName("superhero_name")。
var superheroName: String = "")
var name: String = ""/span>
var photo: String = ""
}
uj5u.com熱心網友回復:
如果onResponse()被呼叫并提供回應,請驗證更新UI的代碼是否在主/ui執行緒上運行。當與網路(其他執行緒)一起作業時,這是常見的問題來源。
activity?.runOnUiThread {
itemList.clear()
itemList.addAll(listData)
adapter.updateData(itemList)
adapter.notifyDataSetChanged()
}
uj5u.com熱心網友回復:
主要問題是:
var binding = FragmentTabHomeActivityBinding.inflate(layoutInflater)
這是在onCreate里面,但是onCreateView是回傳另一個視圖 inflater.inflate(R.layout.card_home, container, false)
所以你正在將配接器應用于一個在系結上的回收器,但是螢屏上的視圖是從布局中膨脹出來的。把它改成這樣:
private lateinit var binding。FragmentTabHomeActivityBinding
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup? , savedInstanceState: Bundle?)。視圖? {
binding = FragmentTabHomeActivityBinding.inflate(layoutInflater, container, false)
return binding.root
}
然后將代碼從onCreate移到onViewCreated,但要確保使用lateinit系結
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
配接器 = HomeCardsAdapter()
var rv = binding.rvHomeCards
rv.adapter = adapter
loadData()
在這之后,你的配接器出現了問題。private lateinit var itemList: List<HomeCards>非常具體地List<HomeCards>。方法notifyDataSetChanged不是通過改變或更新資料結構的參考來作業的,而是在集合被修改時。把它改成這樣:
private val list = mutableListOf<HomeCards>()
override fun getItemCount(): Int {
return list.size()
}
fun updateData(list: List<HomeCards>) {
this.itemList.clear()
this.itemList.addAll(list)
notifyDataSetChanged()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/318384.html
標籤:
上一篇:過濾從Selenium回傳的資訊
