Issue
So, I have a Recyclerview, where every element contains an Icon, a textview and a textedit.
The adapter looks like this:
class ZutatenSmallListAdaptermitEingabe internal constructor(
context: Context, parent: NewRezeptActivity
) : RecyclerView.Adapter<ZutatenSmallListAdaptermitEingabe.ZutatenViewHolder>() {
private val inflater: LayoutInflater = LayoutInflater.from(context)
private var zutaten = emptyList<ZutatenData>()
private var mengenedits = emptyList<RefZutatRezept>()
private val context = context
private val parent = parent
inner class ZutatenViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val zutatenItemView: TextView = itemView.findViewById(R.id.textSmallZutat)
val zutatenPicView: ImageView = itemView.findViewById(R.id.image_SmallZutat)
var zutatenMengenedit : EditText = itemView.findViewById(R.id.textedit_menge)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ZutatenViewHolder {
var itemView :View = inflater.inflate(R.layout.recyclerview_item_small_mitmengeeingabe, parent, false)
return ZutatenViewHolder(itemView)
}
override fun onBindViewHolder(holder: ZutatenViewHolder, position: Int) {
val current = zutaten[position]
val curpos = position
holder.zutatenItemView.text = current.zutname
holder.zutatenPicView.setImageDrawable(ContextCompat.getDrawable(context, current.bild))
holder.zutatenItemView.setOnClickListener {
parent.removeZutat(zutaten[position])
}
var richtigmengenedit = mengenedits.firstOrNull() {it.zutatid == current.zutatid}
if( richtigmengenedit != null) {
holder.zutatenMengenedit.setText(richtigmengenedit.menge)
}
holder.zutatenMengenedit.addTextChangedListener(object : TextWatcher {
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int){
mengenedits[curpos].menge = holder.zutatenMengenedit.text.toString()
}
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
})
}
internal fun setZutaten(zutats: List<ZutatenData>) {
this.zutaten = zutats
var neueListe = emptyList<RefZutatRezept>()
for(zut in zutaten){
var element = mengenedits.firstOrNull(){it.zutatid == zut.zutatid}
if( element!= null){
neueListe += element
}else{
neueListe += RefZutatRezept( zut.zutatid, 0, "")
}
}
mengenedits = neueListe
notifyDataSetChanged()
}
override fun getItemCount(): Int = zutaten.size
}
I have a list "zutaten" where I store the elements I want to display and I have another List "mengenedits", where I store the text the user writes into the textedit.
I also have two functions where I can add and remove elements from the list. Then the new List ist set with setZutatem.
When I add or remove an element I still want to show the right text in the textedit. But the problem is when the List "zutaten" updates, the list of "mengedits" changes correctly, but in the onBindViewHolder function it somehow gets messed up. The text of the secon element shows in the textedit of the first.
Solution
So I am not shure what the porblem was, but I fixed it:
I am only adding and removing certain items, so instead of replacing the whole list, I just removed or added the specific item and instead of calling a notifyDataSetChanged(), I just called notifyItemInserted and notifyItemRemoved
So the functions for removing an adding looked like this:
fun addZutat(zutat: ZutatenData){
zutaten.add(zutat)
mengenedits.add( RefZutatRezept( zutat.zutatid, 0, ""))
notifyItemInserted(zutaten.size -1)
}
fun removeZutat(zutat: ZutatenData){
val pos = zutaten.indexOf(zutat)
zutaten.removeAt(pos)
mengenedits.removeAt(pos)
notifyItemRemoved(pos)
}
Note: I also change the lists to MutableLists, because I wanted to call removeAt()
Answered By - Sonne
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.