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.
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) {}
}
}
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 –
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 –
@SurajRao Die Bilder werden nicht gesetzt, auch wenn es für den Benutzer sichtbar ist. Sehen Sie sich zum Beispiel den Screenshot an. – Saurabh