Kotlin: проблема с RecyclerView при вводе более 6 строк перезаписывается значениями первой строки [закрыто]Android

Форум для тех, кто программирует под Android
Ответить
Гость
 Kotlin: проблема с RecyclerView при вводе более 6 строк перезаписывается значениями первой строки [закрыто]

Сообщение Гость »


Я создаю приложение на Kotlin + XML, и у меня проблема с RecyclerView:

У меня есть два поля etPerson и etContribution, а кнопка btnAdd добавляет этого человека в список участников и обновляет представление rvParticipants, чтобы отобразить обновленный список.

Проблема: когда пользователь вводит 7-го участника; там список rvParticipants полностью перезаписывается повторением 1-й строки во всех строках.

MainActivity.kt

класс MainActivity : AppCompatActivity() {

// Переменные для расчета платежа частный вар totalPayment = 0.0 частный вар платежPerPerson = 0.0 // Список участников частный вал участникList = mutableListOf() // Взгляды частный lateinit var etExpenditure: EditText частный lateinit var etNPersons: EditText частный lateinit var tvPayment: TextView частный lateinit var etPersonName: EditText частный lateinit var etContribution: EditText частный lateinit var tvOwe: TextView частный lateinit var rvParticipants: RecyclerView // Адаптер для списка участников частный lateinit var участникAdapter: ParticipantAdapter переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView (R.layout.activity_main) // Инициализируем представления инициализироватьViews() // Настройка RecyclerView и адаптера настройкаRecyclerView() // Настраиваем кнопку «Добавить» findViewById(R.id.btnAdd).setOnClickListener { добавитьУчастник() } // Настраиваем кнопку «Рассчитать» findViewById(R.id.btnCalculate).setOnClickListener { рассчитать платеж() } // Настраиваем TextWatcher для etExpenditure etExpenditure.addTextChangedListener(объект: TextWatcher { переопределить fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { // Реализация не требуется } переопределить fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { // Реализация не требуется } переопределить fun afterTextChanged(s: Editable?) { рассчитать платеж() } }) // Настраиваем TextWatcher для etNPersons etNPersons.addTextChangedListener(объект: TextWatcher { переопределить fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { // Реализация не требуется } переопределить fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { // Реализация не требуется } переопределить fun afterTextChanged(s: Editable?) { рассчитать платеж() } }) } // Метод инициализации представлений частное развлечение инициализироватьViews() { etExpenditure = findViewById(R.id.etExpenditure) etNPersons = findViewById(R.id.etNPersons) tvPayment = findViewById(R.id.tvPayment) etPersonName = findViewById(R.id.etPersonName) etContribution = findViewById(R.id.etContribution) tvOwe = findViewById(R.id.tvOwe) rvParticipants = findViewById(R.id.rvParticipants) } // Метод для настройки RecyclerView и адаптера частное развлечение setupRecyclerView() { участникAdapter = ParticipantAdapter(participantList, PaymentPerPerson) rvParticipants.adapter = участникАдаптер rvParticipants.layoutManager = LinearLayoutManager(это) } // Метод добавления участника частное развлечение addParticipant() { val name = etPersonName.text.toString() val вклад = etContribution.text.toString().toDoubleOrNull() if (name.isNotEmpty() && вклад != null) { val участник = Участник(имя, вклад) участникList.add(участник) участникAdapter.notifyItemInserted(participantList.size - 1) etPersonName.text.clear() etContribution.text.clear() вычислитьдолги() } еще { // Показать ошибку, если имя пусто или вклад недействителен } } // Метод расчета платежей и долгов частное развлечение CalculPayment() { val расход = etExpenditure.text.toString().toDoubleOrNull() val persons = etNPersons.text.toString().toIntOrNull() if (расходы != ноль && человек != ноль) { итоговый платеж = расходы PaymentPerPerson = общая сумма платежей / человек tvPayment.text = "$" + String.format("%.2f", платежPerPerson) вычислитьдолги() } еще { // Показать ошибку, если расходы или количество человек недействительны tvPayment.text = "" участникList.forEach { участник -> участник.totalContribution = 0,0 } участникAdapter.updatePaymentPerPerson(0.0) участникAdapter.notifyDataSetChanged() } } // Метод расчета долгов для каждого участника частное развлечение CalcDebts() { val nPersons = etNPersons.text.toString().toInt() участникList.forEach { участник -> участник.totalContribution = оплатаPerPerson - участник.вклад } участникAdapter.updatePaymentPerPerson(PaymentPerPerson) участникAdapter.notifyDataSetChanged() }

**ParticipantAdapter.kt** класс ParticipantAdapter( частные участники val: MutableList, частная переменная платежаPerPerson: Double ) : RecyclerView.Adapter() {

// Класс ViewHolder для хранения ссылок на представления каждого элемента списка класс ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { val tvName: TextInputEditText = itemView.findViewById(R.id.tvName) val tvContribution: TextInputEditText = itemView.findViewById(R.id.tvContribution) val tvOwe: TextInputEditText = itemView.findViewById(R.id.tvOwe) val btnDelete: Кнопка = itemView.findViewById(R.id.btnDelete) val tvOweLayout: TextInputLayout = itemView.findViewById(R.id.tvOweLayout) val tvNameLayout: TextInputLayout = itemView.findViewById(R.id.tvNameLayout) } // Метод вызывается при создании нового ViewHolder переопределить удовольствие onCreateViewHolder (родитель: ViewGroup, viewType: Int): ViewHolder { // Раздуваем макет элемента списка val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_participant, родительский, false) вернуть ViewHolder(просмотр) } // Метод вызывается, когда ViewHolder привязан к данным в определенной позиции переопределить удовольствие onBindViewHolder(держатель: ViewHolder, позиция: Int) { val участник = участники[позиция] // Устанавливаем значения TextViews Holder.tvName.setText(имя участника.) Holder.tvContribution.setText(participant.contribution.toString()) Holder.tvOwe.setText(participant.totalContribution.toString()) // Установить тип шрифта полужирным Holder.tvName.setTypeface(null, Typeface.BOLD) Holder.tvContribution.setTypeface(null, Typeface.BOLD) Holder.tvOwe.setTypeface(null, Typeface.BOLD) // Получаем цвет текста и цвет фона tvOwe val textColor = getOweTextColor(participant.totalContribution) val backgroundColor = getOweBackgroundColor(participant.totalContribution) // Устанавливаем цвет текста и цвет фона tvOwe Holder.tvOwe.setTextColor(textColor) Holder.tvOweLayout.boxBackgroundColor = фоновый цвет // Устанавливаем цвет фона tvName updateNameBackgroundColor (держатель, цвет фона) // Настраиваем кнопку удаления Holder.btnDelete.setOnClickListener { участники.removeAt(позиция) notifyItemRemoved (позиция) } // Настраиваем TextWatcher для tvContribution Holder.tvContribution.addTextChangedListener(объект: TextWatcher { переопределить fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { // Реализация не требуется } переопределить fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { // Реализация не требуется } переопределить fun afterTextChanged(s: Editable?) { val вклад = s.toString().toDoubleOrNull() ?: 0.0 участник.вклад = вклад участник.totalContribution = рассчитатьОбщийВклад(участник) Holder.tvOwe.setText(participant.totalContribution.toString()) val textColor = getOweTextColor(participant.totalContribution) val backgroundColor = getOweBackgroundColor(participant.totalContribution) Holder.tvOwe.setTextColor(textColor) Holder.tvOweLayout.boxBackgroundColor = фоновый цвет updateNameBackgroundColor (держатель, цвет фона) } }) // Настраиваем TextWatcher для tvName Holder.tvName.addTextChangedListener(объект: TextWatcher { переопределить fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { // Реализация не требуется } переопределить fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { // Реализация не требуется } переопределить fun afterTextChanged(s: Editable?) { имя значения = s.toString() участник.имя = имя } }) } // Метод, возвращающий количество элементов в списке переопределить удовольствие getItemCount(): Int { вернуть участников.размер } // Метод получения цвета текста tvOwe на основе общего вклада личное развлечение getOweTextColor(totalContribution: Double): Int { вернуться, когда { TotalContribution == 0.0 -> Color.BLUE TotalContribution > 0.0 -> Color.RED totalContribution < 0.0 -> Color.parseColor("#004D00") // Здесь изменяем значение зеленого цвета еще -> Цвет.ПРОЗРАЧНЫЙ } } // Метод получения цвета фона tvOwe на основе общего вклада личное развлечение getOweBackgroundColor(totalContribution: Double): Int { вернуться, когда { totalContribution == 0.0 -> Color.parseColor("#CCCCCC") totalContribution > 0.0 → Color.parseColor("#FFD4D4") totalContribution < 0.0 -> Color.parseColor("#E2FFD7") еще -> Цвет.ПРОЗРАЧНЫЙ } } // Метод обновления цвета фона tvName на основе цвета фона tvOwe частное развлечение updateNameBackgroundColor (держатель: ViewHolder, backgroundColor: Int) { Holder.tvNameLayout.boxBackgroundColor = цвет фона } // Метод добавления участника в список весело addParticipant (участник: Участник) { участники.add(участник) уведомитьDataSetChanged() } // Метод обновления значения payPerPerson забавное обновлениеPaymentPerPerson(оплата: Double) { платежPerPerson = оплата уведомитьDataSetChanged() } // Метод расчета общего вклада участника частное развлечение вычислитьTotalContribution(участник: Участник): Double { возврат платежаPerPerson - участник.вклад }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»