2016-12-24 2 views
1

Я пытался сделать RecyclerView работу в моем приложении, где элементы списка ImageView s, и изображения загружаются и помещаются внутри (асинхронно) в методе onBindViewHolder. Я не предъявляются какие-либо ошибки в своем коде, но по какой-то причинеRecycleView элементы списка не отображаются

только перечень вопросов, которые будут видны (даже частично) к пользователю при загрузке активности, имеют изображения загружаются в них.

Хотя я не вижу изображения, я заметил, что высота и ширина этих элементов распределены правильно. И поскольку изображения сначала загружаются, а затем определяются размеры ImageView, я полагаю, что проблема имеет что-то общее с RecyclerView? Если кто-то может пролить свет на это, было бы здорово. Благодарю.

Я также хотел бы добавить, что если действие приостановлено, а затем возобновлено (нажав кнопку «квадрат» и затем возобновив его), изображения всех элементов списка загрузятся правильно.

PiC# 1 as you can see the gray portion where an image is supposed to be PiC# 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. Если вам все равно не нужно, вам нужно просто использовать listview –

+0

@SurajRao Изображения не устанавливаются, даже если они видны пользователю. Например, см. Скриншот. – Saurabh

ответ

0

Он работал после того, как я сделал привязку данных к запросу Синхронный, и я переместил манипуляции 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() 
}