3 回答
TA贡献1842条经验 获得超12个赞
您应该按以下方式尝试:
if (convertView == null) {
holder = new ViewHolder();
LayoutInflater vi = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.element_in_game, null);
holder.scoreToUpdate = (EditText) convertView
.findViewById(R.id.elementUpdateScore);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//binding data from array list
holder.scoreToUpdate.setText(scoresToUpdate[position]);
holder.scoreToUpdate.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
//setting data to array, when changed
scoresToUpdate[position] = s.toString();
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
return convertView;
}
说明:ListView的回收行为实际上会在视力不佳时擦除与其行项目绑定的所有数据。因此,无论需要从哪个方向重新绑定数据,每一个新的行都会出现。另外,当EditText文本更改时,还必须将值保留在某些数据结构中,因此稍后再次进行行数据绑定时,可以提取位置数据。您可以使用数组ArrayList来保留edittext数据,也可以用于绑定数据。
Recyclerview Adapter中使用类似的行为,在逻辑背后,您需要了解适配器的行数据的数据绑定。
TA贡献2012条经验 获得超12个赞
如果只有10行,请不要理会ListView。只需将它们垂直放置LinearLayout并用包裹即可,ScrollView这将为您节省一些麻烦。
如果您要拥有数十行或数百行,我建议您想出比行中的EditText窗口小部件更好的UX范例 ListView。
话虽这么说,感觉就像您没有正确处理行回收,或没有意识到行被回收。如果您的中有10个项目ListAdapter,并且只有空间显示5个带有EditText小部件的行,则EditText当用户滚动到底部时,不应显示10 个小部件。您应该以5-7结束-屏幕上的那个,或者当用户下一次滚动时,另外一个或两个可以回收。
这个免费的摘录从我的书一个经过创建自定义子类的过程ArrayAdapter,并得到回收利用工作。它还涵盖了使用RatingBar用户输入的交互式行。这比起来容易得多EditText,因为您只需要担心单击事件。欢迎您尝试使用EditText小部件和TextWatcher侦听器扩展该技术,但我不是粉丝。
- 3 回答
- 0 关注
- 709 浏览
添加回答
举报