저는 Android에 익숙하지 않아 현재 사용자 지정 목록 어댑터를 사용하는 데 문제가 있습니다.ListAdapter는 스크롤 할 때 이미 표시된 항목을 표시합니다.
기본적으로 각 질문 (라디오, 체크 박스, 텍스트, 숫자)마다 다른 유형의 질문 목록을 만들고 싶습니다. listview가 생성되면 정상적으로 표시됩니다. 하지만 아래로 스크롤하면 맨 아래의 항목이 다시 생성됩니다.
내 코드는 다음과 같다 :
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;
}
?
정말 고맙습니다. 다른 솔루션을 검색했지만 내 코드에서 작동하지 않습니다. 잘못 convertView
및 ViewHolder
을 사용하고 있기 때문에
감사
** ** 첫 번째 항목은 무엇입니까? 커스텀'ArrayAdapter' 인스턴스를 어떻게 만들고 있습니까? – nKn
아, 미안하지만, 나는 처음 발견 한 것만 알았지 만, 나는 당신의 게시물을보고 다시 확인했다. 분명히 스크롤 할 때마다 화면 밖으로 나온 항목이 불러 와서 목록에 있어야 할 다음 항목을 바꿉니다. – alfa
그러면 @ LukaCiko의 대답은 정확합니다. 태그를 관리하는 것 뿐이므로'ViewHolder' 내부에서'View'를 업데이트하지 않습니다. – nKn