gpt4 book ai didi

java - ListAdapter 在滚动时显示已显示的项目

转载 作者:行者123 更新时间:2023-12-01 23:12:21 26 4
gpt4 key购买 nike

我对 Android 还很陌生,目前在使用自定义列表适配器时遇到一些问题。

基本上,我想制作一个问题列表,每个问题都有不同的类型(单选、复选框、文本、数字)。当 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;
}

我做错了什么?

我真的很感谢你的帮助。我搜索了一些其他解决方案,但无法在我的代码上运行。

谢谢

最佳答案

发生这种情况是因为您错误地使用了 convertViewViewHolder。当向下滚动时, View 将被回收,并且 converView 不会为空。 ViewHolder 模式通常这样使用:

public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
inflate the view
create a ViewHolder and store the necessary views in it
use setTag to store the ViewHolder in the convertView
}
else {
use getTag to get the ViewHolder
}
update the views // <- you are not doing this when convertView != null
}

使用convertView/ViewHolder模式的原因是列表中的 View 通常具有相同的布局,但其中显示的数据不同。本质上,convertView(当不为 null 时)是列表中先前使用的 View ,必须进行转换才能显示该位置的正确数据。通过重用它,您可以避免昂贵的布局膨胀。 ViewHolder 是一项进一步的优化,您可以避免昂贵的 findViewById 调用。

关于java - ListAdapter 在滚动时显示已显示的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21688978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com