Я довольно новичок в Android, и в настоящее время у меня проблемы с использованием адаптера пользовательского списка.ListAdapter, показывающий уже показанный элемент при прокрутке
В принципе, я хочу составить список вопросов, имеющих различный тип для каждого вопроса (радио, флажок, текст, числовые). Когда создается список, оно отображается нормально. Но когда я прокручиваю вниз, элемент сверху поднимается в нижней части.
Мой код выглядит так:
public View getView(int position, View convertView, ViewGroup parent) {
View someView = convertView;
//get question type
String type = questions.get(position)[2];
//declare viewholder
final ViewHolder holder;
Log.i("Position", Integer.toString(position));
if (someView == null) {
Log.i("convertView", "null");
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
someView = inflater.inflate(R.layout.list_survey, parent, false);
TextView textView = (TextView) someView.findViewById(R.id.surveyQuestion);
textView.setText(questions.get(position)[1]);
LinearLayout optionContainer = (LinearLayout) someView.findViewById(R.id.surveyOption);
int size = options.get(position).size();
//radio button
if (type.equals("radio")) {
RadioGroup group = new RadioGroup(this.context);
RelativeLayout.LayoutParams groupParam = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
optionContainer.addView(group, groupParam);
RadioButton radio = null;
ArrayList<RadioButton> radios = new ArrayList<RadioButton>();
for (int i=0; i<size; i++){
radio = new RadioButton(this.context);
radio.setId(i+1);
radio.setText(options.get(position).get(i)[1]);
group.addView(radio);
radios.add(radio);
}
group.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
public void onCheckedChanged(RadioGroup group, int checkedId) {
//Model element = (Model)group;
}
});
holder.radiogroup = group;
holder.radiobuttons = radios;
//checkbox
} else if (type.equals("check")) {
CheckBox checkbox = null;
ArrayList<CheckBox> checks = new ArrayList<CheckBox>();
for (int i=0; i<size; i++){
checkbox = new CheckBox(this.context);
checkbox.setId(i+1);
checkbox.setText(options.get(position).get(i)[1]);
optionContainer.addView(checkbox);
checks.add(checkbox);
}
holder.checkboxes = checks;
//textfield
} else if (type.equals("txt")) {
EditText field = null;
ArrayList<EditText> fields = new ArrayList<EditText>();
for (int i=0; i<size; i++){
field = new EditText(this.context);
field.setId(i+1);
field.setHint(options.get(position).get(i)[1]);
optionContainer.addView(field);
fields.add(field);
}
holder.edittext = fields;
//numeric
} else if (type.equals("num")) {
EditText field = null;
ArrayList<EditText> fields = new ArrayList<EditText>();
for (int i=0; i<size; i++){
field = new EditText(this.context);
field.setId(i+1);
field.setHint(options.get(position).get(i)[1]);
field.setInputType(InputType.TYPE_CLASS_NUMBER);
optionContainer.addView(field);
fields.add(field);
}
holder.edittext = fields;
}
someView.setTag(holder);
} else {
Log.i("convertView", "not null");
holder = (ViewHolder) someView.getTag();
}
return someView;
}
Класс viewHolder здесь:
//viewHolder
static class ViewHolder {
ArrayList<CheckBox> checkboxes;
ArrayList<EditText> edittext;
RadioGroup radiogroup;
ArrayList<RadioButton> radiobuttons;
}
Что я делаю неправильно?
Я очень ценю вашу помощь. Я искал некоторые другие решения, но я не могу заставить его работать над своим кодом.
Благодаря
** Только ** первый пункт? Не могли бы вы вставить, как вы создаете свой собственный экземпляр «ArrayAdapter»? – nKn
Ах, извините, я заметил только первое появление, но потом увидел ваш пост и проверил его. По-видимому, каждый раз, когда он прокручивается, элемент, который вышел из экрана, вызывается и заменяет следующий элемент, который должен быть в списке. – alfa
Тогда ответ @ LukaCiko правильный. Вы просто управляете тегом, но вы не обновляете '' '' '' '' '' '' '' '' '' '' 'ViewHolder''. – nKn