0

我有一个充满自定义类扩展 BaseAdapter 的 listView

 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" 是一个编辑文本:

我在列表的第一项上更改了“campoNum”的值(并且效果很好),但是如果我向下滚动,列表的其他一些项目,保持第一项的相同值....

我尝试分析它,我发现:

如果我在列表中有 3 个项目可见,并且我更改了第一个项目,则第 5 个将采用与第一个相同的值,如果我有 4 个可见的项目,如果我更改第一个,也会更改第 6 个......等等。

如果我删除“if (view == null)”并且每次都让视图膨胀,问题就解决了!

如果我很好理解:每次隐藏列表的一项(第一项)时,它将用于新出现的项(第五项),并且第五项传递的 convertVIew 与第一项相同

有什么建议么?

4

2 回答 2

2

是的,这就是列表视图的工作方式。当您向上/向下滚动时,项目会重新打印为其原始布局和数据。我在更改项目图标颜色时遇到了完全相同的问题。

一种解决方法是myText= ""对所有列表视图项使用数组,例如数组项。数组项的位置与列表视图中项的位置相同。

在您的 getView 中,当您将文本添加到 editText 时,将其存储到数组中的 myText 中。

您需要做的就是在 getView 中再次说

if myText is not empty, add myText to the items editText. 您可以通过代码完成这一切。

当您现在向上/向下滚动时,它将使用存储的文本填充任何项目 editText 的文本,例如 myText

您可以将此方法用于您想要为列表视图中的项目更改的任何内容。图标、文字等

因此,在数组中存储一些内容以表示项目的状态或数据更改,然后在滚动时设置它。

这一切都在内部完成getView

于 2015-10-16T09:30:15.107 回答
0

当您在编辑文本中输入值时,将该值与位置(作为值的键)一起放入哈希图中,并且每次显示编辑文本时,您都应该从位置键上的哈希图中获取值(如果存在)。

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());


        }

    }
}
于 2015-10-16T11:01:08.747 回答