клику на элемент он перемещался в вех списка, но перемещение происходит рандомно.
class DiffAdapter(private val item: Item) :
ListAdapter<Pair<String, Double>, DiffViewHolder>(MyDiff()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = DiffViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_converter, parent, false)
)
override fun onBindViewHolder(holder: DiffViewHolder, position: Int) {
val measure = item.measures[position]
holder.onBind(measure.first, item.value * measure.second, object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
item.value = s.toString().toDouble() / measure.second
holder.itemView.post { notifyDataSetChanged() }
}
override fun afterTextChanged(s: Editable?) {
}
}) { v, hasFocus ->
if (hasFocus) {
item.measures.add(0, item.measures.removeAt(position))
notifyItemMoved(position, 0)
}
}
}
override fun getItemCount(): Int {
return item.measures.size
}
}
class DiffViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val labelTv: TextView = itemView.findViewById(R.id.label_tv)
val measureEdit: EditText = itemView.findViewById(R.id.measure_edit)
fun onBind(
label: String,
currentValue: Double,
watcher: TextWatcher,
listener: View.OnFocusChangeListener
) {
labelTv.text = label
measureEdit.setText(currentValue.toString())
measureEdit.addTextChangedListener(watcher)
measureEdit.onFocusChangeListener = listener
}
}
class MyDiff : DiffUtil.ItemCallback<Pair<String, Double>>() {
override fun areItemsTheSame(
oldItem: Pair<String, Double>,
newItem: Pair<String, Double>
): Boolean {
return oldItem.first == newItem.first
}
override fun areContentsTheSame(
oldItem: Pair<String, Double>,
newItem: Pair<String, Double>
): Boolean {
return oldItem.first == newItem.first && oldItem.second == newItem.second
}
}
Не надо портянок! 👉https://pastebin.com/👈
зачем использовать listAdapter с notify - методами
Нужно чтобы при нажатии на EditText, поле с анимацией перемещалось в верх списка, notifyDataSetChanged() отрабатывает нормально.
Создай в adapter метод insert, и встать в нужную позицию, и не забудь про метод notifyItemChanged
Обсуждают сегодня