我有一个listView填充了一个custum类extends BaseAdapter
private List<Bundle> allTipologiaInsetti = ....;
listView.setAdapter(new CustumAdapter(getBaseContext(), allTipologiaInsetti, this));
然后在我的适配器上..
public class CustumAdapter extends BaseAdapter {
public CustumAdapter (Context context, List<Bundle> items, RaccoltaDatiQuestions activity) {
// TODO Auto-generated constructor stub
this.context = context;
this.items = items;
//update
map = new HashMap<Number, String>();
}
...
public View getView(final int position, View convertView, ViewGroup parent) {
Bundle myObj = items.get(position);
ViewHolder holder;
view = convertView;
if (view == null ) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.tipologia_insetti_item, null);
holder.campoNum = (EditText) view.findViewById(R.id.numField);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
//UPDATE
String num = map.get(position);
if(num!=null && !num.equals("")){
holder.campoNum.setText(num + "");
}else {
holder.campoNum.setText(myObj.getInt("num") + "");
}
holder.campoNum.addTextChangedListener(new GenericTextWatcher(holder.campoNum, position));
}
public GenericTextWatcher(EditText campNum, int position) {
this.position = position;
this.campoNum = campNum;
}
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
public void afterTextChanged(Editable s) {
if (campoNum.getText().length() > 0) {
if (campoNum.getText().hashCode() == s.hashCode()) {
Bundle myObj = items.get(position);
myObj.putInt("num", Integer.parseInt(s.toString()));
//UPDATE
map.put(position, s.toString());
}
}
}
}
“campoNum”是一个editText:
我在列表的第一个项目上更改了“campoNum”的值(并且它运行良好),但是如果我向下滚动,列表的其他一些项目,保持第一项的相同值....
我尝试分析它并发现:
如果我在列表中有3个项目可见,并且我更改了第一个项目,则第5个将采用相同的第一个值,如果我有4个项目可见,如果我更改第一项,也将更改第6个...等..
如果我删除“if(view == null)”并且我每次都让视图膨胀,问题就解决了!
如果我理解:每次隐藏一个列表项(第一个)时,它将用于新出现的项目(第5个),并且传递给第五个项目的convertVIew与第一个项目相同< / p>
有什么建议吗?
答案 0 :(得分:2)
是的,这就是listviews的工作原理。当您向上/向下滚动项目时,将重新打印到其原始布局和数据。更改项目图标颜色时遇到了完全相同的问题。
解决方法是为所有listview项使用数组,例如数组项myText= ""
。数组项的位置与列表视图中项的位置相同。
将它存储到数组中的myText。
你需要做的就是再次在getView中说
if myText is not empty
,add myText to the items editText
。你通过代码完成所有这些。
当你向上/向下滚动时,它将填写任何项目的文本editText与存储的文本,例如myText
您可以将此方法用于要为列表视图中的项目更改的任何内容。图标,文字等。
因此,在数组中存储一些东西来表示一个Item的状态或数据更改,然后在滚动时设置它。
所有这些都是在getView
答案 1 :(得分:0)
当你在edittext中放入值时,将该值与hashmap一起放在位置(AS作为值的键),每当你显示Edittext时,你应该从位置键上的hashmap获取值, 如果存在的话。
public CustumAdapter (Context context, List<Bundle> items, RaccoltaDatiQuestions activity) {
// TODO Auto-generated constructor stub
this.context = context;
this.items = items;
//update
map = new HashMap<Number, String>();
}
...
public View getView(final int position, View convertView, ViewGroup parent) {
Bundle myObj = items.get(position);
ViewHolder holder;
view = convertView;
if (view == null ) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.tipologia_insetti_item, null);
holder.campoNum = (EditText) view.findViewById(R.id.numField);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
//UPDATE
String num = map.get(position);
if(num!=null && !num.equals("")){
holder.campoNum.setText(num + "");
}else {
holder.campoNum.setText(myObj.getInt("num") + "");
}
if (map.containsKey(position)){
holder.campoNum.setText(map.get(position));
}
holder.campoNum.addTextChangedListener(new GenericTextWatcher(holder.campoNum, position));
}
public GenericTextWatcher(EditText campNum, int position) {
this.position = position;
this.campoNum = campNum;
}
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
public void afterTextChanged(Editable s) {
if (campoNum.getText().length() > 0) {
map.put(position, campoNum.getText().toString());
}
}
}