2016-12-24 2 views
1

Ich habe RecyclerView Arbeit in meiner app, wo die Listenelemente ImageView s zu machen versucht, und die Bilder erhalten heruntergeladen und nach innen setzen (asynchron) in den onBindViewHolder Verfahren. Ich bin vor keine Fehler in meinem Code, aber aus irgendeinem GrundRecycleView Listenelemente nicht angezeigt

nur die Listenelemente, die (auch teilweise) an den Benutzer sichtbar sein wird, wenn die Aktivität Lasten haben Bilder in sie geladen.

Obwohl ich die Bilder nicht sehen kann, habe ich beobachtet, dass die Höhe und Breite dieser Elemente richtig zugeordnet wurden. Und da die Bilder zuerst heruntergeladen werden, und dann die ImageView 's Abmessungen bestimmt sind, stelle ich fest, dass das Problem etwas mit RecyclerView selbst zu tun hat? Wenn jemand etwas Licht darauf werfen könnte, wäre es großartig. Vielen Dank.

Ich möchte auch hinzufügen, dass, wenn die Aktivität pausiert und dann fortgesetzt wird (durch Klicken auf die "Quadrat" Navigationsschaltfläche und dann wieder aufnehmen), die Bilder aller Listenelemente korrekt geladen werden.

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

mein Code hier:

onCreate Methode:

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) 

} 

Die RecyclerView.Adapter Klasse:

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

wissen Sie was? Das ist ein komplettes Missverständnis der Logik hinter RecyclerView, Adapter und ViewHolder. Der Adapter sollte Daten an Ansichten binden, Sie versuchen jedoch, Ansichten in Ansichten einzufügen. RTFM https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html –

+0

Wie werden Bilder nicht gesetzt, wenn es für den Benutzer ein Problem ist? Aus diesem Grund werden Recycler-Ansichten verwendet .. check https://developer.android.com/training/material/lists-cards.html. Wenn Sie es immer noch nicht brauchen, sollten Sie einfach listview verwenden –

+0

@SurajRao Die Bilder werden nicht gesetzt, auch wenn es für den Benutzer sichtbar ist. Sehen Sie sich zum Beispiel den Screenshot an. – Saurabh

Antwort

0

Es funktionierte, nachdem ich die Bindung von Daten in eine synchrone Anfrage gemacht habe, und ich bewegte die ImageView Manipulation (Ändern LayoutParams) in die onViewAttachedToWindow überschriebene Methode meines Adapters.

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() 
} 
Verwandte Themen