Как показать радиообуTton и Edittext внутри ListView?
-
28-09-2019 - |
Вопрос
Я хочу реализовать Radiobutton и Edittext внутри ряда listView. Я использую ArrayAdapter, чтобы заполнить список. Но проблема в том, что когда я выбираю Radiobutton и прокрутите список по списку и снова прокрутите радиообуттон, который был выбран, является невыбранным. То же самое с содержанием Edittext. Текст удаляется при проведении прокрутки.
Решение
Проверьте свой адаптер, вы, вероятно, не делаете работу прямо на bindView()
. Отказ Вы должны настроить снова на bindView()
ценности.
Я переформурую предложение, и вы, вероятно, будете поймете. То newView()
Создает только 5-10 просмотров (столько, сколько они помещаются на экран), и они повторно используются для других рядов. Если у тебя есть ListView
С 200 линиями в нем на самом деле у вас всего 5-10 просмотров, и вы должны убедиться, что вы обновляете представления с действительными изменениями в bindView()
. Отказ Вы должны хранить / сохранить изменения в объекте для более позднего повторного использования.
Другие советы
Проблема в том, что все взгляды, которые покидают экран, могут быть уничтожены, чтобы сохранить память на телефоне. Если телефон не сделает этот список с 1000 записями, заполнит память вашего устройства.
Из-за того, что изменение состояния, которое происходит с радиообуттоном и текстом, который был вставлен в EDitText, просто будет удален, и если пользователь прокручивает представление, будет воссоздан.
Вам необходимо сохранить состояние радиообуттона и текста редактирования в своем адаптере и повторно применить состояние в тот момент, когда вы воссоздаете представление для этого специального элемента в вас GetView. метод.
Функция GetView в базовом адаптере. Сохраняет значение EDitText и отображает то же самое, если ConvertView не является NULL.
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.list_row_person, null);
holder = new ViewHolder();
holder.PersonNameView = (TextView) convertView.findViewById(R.id.PersonNameView);
holder.SpendAmount = (EditText) convertView.findViewById(R.id.SpendAmt);
holder.SpendAmount.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
int position2 = holder.SpendAmount.getId();
EditText Caption = (EditText) holder.SpendAmount;
Person per= (Person)holder.SpendAmount.getTag();
//SpendAmount is of Double type
if(s.toString().length()>0){
per.setSpendAmount(Double.parseDouble(s.toString()));
per.setFlag(true);}
else{
Toast.makeText(getApplicationContext(), "Please enter some value", Toast.LENGTH_SHORT).show();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
holder.SpendAmount.setTag(listData.get(position));
convertView.setTag(holder);
} else {
((ViewHolder)convertView.getTag()).SpendAmount.setTag(listData.get(position));
holder = (ViewHolder) convertView.getTag();
}
holder.PersonNameView.setText(listData.get(position).getPersonName());
holder.SpendAmount.setText(listData.get(position).getSpendAmount().toString());
return convertView;
}
class ViewHolder {
TextView PersonNameView;
EditText SpendAmount ;
}