A ViewAdapter
повторно использует View
. Таким образом, при прокрутке вместо создания новых видов Адаптер будет повторно использовать вид, который больше не виден.
Итак, это главная причина, по которой у вас есть onBindViewHolder
. С помощью этого метода Android дает вам возможность обновить содержимое просмотра, прежде чем оно станет видимым. Если вы не обновите все содержимое (TextView
и EditText
), вы увидите проблемы, подобные той, о которой вы упоминали.
Обратите внимание на этот код:
@Override
public void onBindViewHolder(@NonNull Myholder myholder, int i) {
myholder.txtJantriNumber.setText(String.valueOf(i + 1));
}
Как видите, вы обновляете только TextView
. Таким образом, TextView
(используется повторно или нет) всегда будет отображать правильный текст. Однако вы не обновляете содержимое EditText
. Таким образом, если представление было только что создано, EditText
будет пустым. Если представление используется повторно, вы увидите старое значение (из другой строки).
Итак, чтобы правильно обновлять EditText
, вы должны хранить все тексты в отдельном списке. Например:
public class AdapterJantri extends RecyclerView.Adapter<AdapterJantri.Myholder> {
private String[] mTextList;
public AdapterJantri() {
mTextList = new String[getItemCount()];
}
@Override
public void onBindViewHolder(@NonNull Myholder myholder, int i) {
myholder.txtJantriNumber.setText(String.valueOf(i + 1));
// Here, you update the EditText content
myholder.edJantriNumber.setText(mTextList[i]);
}
@Override
public void onViewRecycled(@NonNull final Myholder holder) {
// Here, you save the text before the view gets recycled
int index = holder.getAdapterPosition();
if (index >= 0) {
mTextList[index] = holder.edJantriNumber.getText().toString();
}
}
}
EDIT
Если у вас есть TextWatcher
и вам необходимо временно его отключить, я предлагаю:
Первый
Не создавайте TextWatcher
внутри bindViewHolder
. Вам не нужно создавать новый каждый раз. Просто добавьте это и удалите это. Вы можете использовать свой MyHolder
как TextWatcher
public class Myholder extends RecyclerView.ViewHolder implements TextWatcher {
EditText edJantriNumber;
TextView txtJantriNumber;
public Myholder(@NonNull View itemView) {
super(itemView);
edJantriNumber = itemView.findViewById(R.id.ed_jantri_number);
txtJantriNumber = itemView.findViewById(R.id.txt_jantri_number);
}
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
// Add your code here
}
@Override
public void onTextChanged(final CharSequence s, final int start, final int before,
final int count) {
// Add your code here
}
@Override
public void afterTextChanged(final Editable s) {
// Add your code here
}
public void disableTextChangeListner() {
// This will remove the listener. So, it will stop to listen to new events
edJantriNumber.removeTextChangedListener(this);
}
public void addTextChangeListner() {
// This will add the listener. So, it will start to listen to new events
edJantriNumber.addTextChangedListener(this);
}
}
Затем, во время bindViewHolder
, отключите прослушиватель, установите новый текст и снова добавьте прослушиватель следующим образом:
@Override
public void onBindViewHolder(@NonNull Myholder myholder, int i) {
myholder.disableTextChangeListner();
myholder.txtJantriNumber.setText(String.valueOf(i + 1));
myholder.edJantriNumber.setText(mTextList[i]);
myholder.addTextChangeListner();
}