2016-12-24 76 views
1

我一直在嘗試使RecyclerView在我的應用程序中工作,其中列表項是ImageView s,並且圖像被下載並放入(異步)在onBindViewHolder方法中。我不是對着我的代碼中的任何錯誤,但由於某些原因RecycleView列表項不顯示

只有列表中的項目,這將是可見的(甚至部分)給用戶 活動時的負荷,也圖像加載到他們。

雖然我看不到圖像,但我觀察到這些項目的高度和寬度已正確分配。並且由於圖像首先被下載,然後ImageView的尺寸被確定,我認爲問題與RecyclerView本身有關?如果有人能夠闡明這一點,那將會很棒。謝謝。

我還想補充一點,如果活動暫停然後恢復(通過點擊「方形」導航按鈕然後恢復),所有列表項的圖像加載正確。

產品圖#1 as you can see the gray portion where an image is supposed to be 產品圖#2 somewhat more convincing :)

這裏是我的代碼:

onCreate方法:

override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 

     recyclerView { 
      id = ViewID.ID_LIST 
     } 

     val imgList = ArrayList<ImageView>() 
     imgList.add(ImageView(ctx)) 
     imgList.add(ImageView(ctx)) 
     imgList.add(ImageView(ctx)) 
     imgList.add(ImageView(ctx)) 
     val lv = findViewById(ViewID.ID_LIST) as RecyclerView 
     lv.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) 
     lv.adapter = ImageRecyclerAdapter(ctx, imgList) 

} 

RecyclerView.Adapter類:

private class ImageRecyclerAdapter(val context: Context, val imageList: ArrayList<ImageView>) : 
      RecyclerView.Adapter<RecyclerView.ViewHolder>() { 

     override fun onViewRecycled(holder: RecyclerView.ViewHolder?) { 
      super.onViewRecycled(holder) 
      if (holder != null) { 
       val v = holder.itemView as ImageView 
       v.setImageBitmap(null) 
      } 
     } 

     override fun onBindViewHolder(p: RecyclerView.ViewHolder, position: Int) { 
      val v = p.itemView as ImageView 
      Ion.with(v) 
        .load("https://pbs.twimg.com/profile_images/616076655547682816/6gMRtQyY.jpg") 
        .setCallback({ exception, t -> 
         if (t != null) { 
          val dm = Point() 
          context.windowManager.defaultDisplay.getRealSize(dm) 
          val w = t.maxWidth 
          val h = t.maxHeight 

          val params = t.layoutParams 
          if (params != null) { 
           params.width = dm.x 
           params.height = (dm.x * (h.toDouble()/w.toDouble())).toInt() 
           t.layoutParams = params 
           t.requestLayout() 
          } 
         } 
        }) 
     } 

     override fun getItemCount(): Int { 
      return imageList.size 
     } 

     override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { 
      val v = ImageView(context) 
      return object : RecyclerView.ViewHolder(v) {} 
     } 
    } 
+0

你知道嗎?這是對recyclerView,適配器和ViewHolder背後邏輯的徹底誤解。適配器應該將數據綁定到視圖,但是您正試圖將視圖放入視圖。 RTFM https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html –

+0

當用戶看不到圖像時,圖像是如何設置的?其實這就是爲什麼recyclerviews使用..check https://developer.android.com/training/material/lists-cards.html。如果你仍然不需要它,那麼你應該只使用列表視圖 –

+0

@SurajRao即使用戶可見圖像也沒有設置。例如,請參閱截圖。 – Saurabh

回答

0

它在我將數據綁定到Synchronous請求後,並且我將ImageView操作(將LayoutParams更改爲onViewAttachedToWindow我的適配器的重寫方法)後,它工作。

onViewAttachedToWindow

override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder?) { 
    super.onViewAttachedToWindow(holder) 
    val t = holder?.itemView as ImageView 
    val dm = Point() 
    context.windowManager.defaultDisplay.getRealSize(dm) 
    val w = t.maxWidth 
    val h = t.maxHeight 
    val params = t.layoutParams 
    if (params != null) { 
     params.width = dm.x 
     params.height = (dm.x * (h.toDouble()/w.toDouble())).toInt() 
     t.layoutParams = params 
     t.requestLayout() 
    } 
} 

onBindViewHolder

override fun onBindViewHolder(p: RecyclerView.ViewHolder, position: Int) { 
    val v = p.itemView as ImageView 
    Ion.with(v) 
      .load(imageList[position].toString()) 
      .tryGet() 
}