Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android convertview listview适配器编辑文本_Android_Listview_Android Listview_Baseadapter_Convertview - Fatal编程技术网

Android convertview listview适配器编辑文本

Android convertview listview适配器编辑文本,android,listview,android-listview,baseadapter,convertview,Android,Listview,Android Listview,Baseadapter,Convertview,我有一个用custum类扩展BaseAdapter填充的列表视图 private List<Bundle> allTipologiaInsetti = ....; listView.setAdapter(new CustumAdapter(getBaseContext(), allTipologiaInsetti, this)); private List allTipologiaInsetti=。。。。; setAdapter(新的CustumAdapter(getBaseC

我有一个用custum类扩展BaseAdapter填充的列表视图

 private List<Bundle> allTipologiaInsetti = ....;
 listView.setAdapter(new CustumAdapter(getBaseContext(), allTipologiaInsetti, this));
private List allTipologiaInsetti=。。。。;
setAdapter(新的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());

            }
        }

    }
}
公共类CustumAdapter扩展BaseAdapter{
公共CustumAdapter(上下文、列表项、RaccoltaDatiQuestions活动){
//TODO自动生成的构造函数存根
this.context=上下文;
这个项目=项目;
//更新
map=新的HashMap();
}
...
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
Bundle myObj=items.get(位置);
视窗座;
视图=转换视图;
如果(视图==null){
holder=新的ViewHolder();
视图=充气机。充气(R.layout.tipologia_insetti_项目,空);
holder.campoNum=(EditText)view.findViewById(R.id.numField);
视图.设置标签(支架);
}否则{
holder=(ViewHolder)view.getTag();
}
//更新
String num=map.get(位置);
如果(num!=null&&!num.equals(“”){
holder.campoNum.setText(num+“”);
}否则{
holder.campoNum.setText(myObj.getInt(“num”)+”);
}
holder.campoNum.addTextChangedListener(新的GenericTextWatcher(holder.campoNum,position));
}
公共GenericTextWatcher(EditText campNum,int位置){
这个位置=位置;
this.campoNum=campNum;
}
public void beforeTextChanged(CharSequence CharSequence,inti,inti1,inti2){
public void onTextChanged(CharSequence CharSequence,inti,inti1,inti2){
公共无效后文本已更改(可编辑){
if(campoNum.getText().length()>0){
if(campoNum.getText().hashCode()==s.hashCode()){
Bundle myObj=items.get(位置);
myObj.putInt(“num”,Integer.parseInt(s.toString());
//更新
map.put(位置,s.toString());
}
}
}
}
“campoNum”是一个编辑文本:

我在列表的第一项上更改了“campoNum”的值(它工作得很好),但如果我向下滚动列表的其他一些项,则保持第一项的相同值

我试图分析它,我发现:

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

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

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


有什么建议吗

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

解决方法是对所有listview项目使用数组,例如数组项
myText=“
”。数组项的位置与该项在listview中的位置相同

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

同样,在getView中,您需要做的就是

如果myText不是空的
将myText添加到项目editText
。这一切都是通过代码完成的

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

对于listview中的项目,您可以使用此方法来更改任何内容。图标、文本等

因此,在数组中存储一些表示某个项的状态或数据更改的内容,然后在滚动时进行设置


所有这些都是在
getView

中完成的,当您将值放入edittext时,将该值与位置一起放入hashmap(作为值的键),并且每次显示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());


        }

    }
}
public CustumAdapter(上下文、列表项、RaccoltaDatiQuestions活动){
//TODO自动生成的构造函数存根
this.context=上下文;
这个项目=项目;
//更新
map=新的HashMap();
}
...
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
Bundle myObj=items.get(位置);
视窗座;
视图=转换视图;
如果(视图==null){
holder=新的ViewHolder();
视图=充气机。充气(R.layout.tipologia_insetti_项目,空);
holder.campoNum=(EditText)view.findViewById(R.id.numField);
视图.设置标签(支架);
}否则{
holder=(ViewHolder)view.getTag();
}
//更新
String num=map.get(位置);
如果(num!=null&&!num.equals(“”){
holder.campoNum.setText(num+“”);
}否则{
holder.campoNum.setText(myObj.getInt(“num”)+”);
}
if(地图容器(位置)){
holder.campoNum.setText(map.get(position));
}
holder.campoNum.addTextChangedListener(新的GenericTextWatcher(holder.campoNum,position));
}
公共GenericTextWatcher(EditText campNum,int位置){
这个位置=位置;
this.campoNum=campNum;
}
public void beforeTextChanged(CharSequence CharSequence,inti,inti1,inti2){
public void onTextChanged(CharSequence CharSequence,inti,inti1,inti2){
公共无效后文本已更改(可编辑){
if(campoNum.getText().length()>0){
map.put(position,campoNum.getText().toString());
}
}
}

也许我不明白。。。(你的建议几乎是我已经做过的?!…我从Bundle myObj=items.get(position)读取了值,并在值更改时设置:myObj.putin(“num”,Integer.parseInt(s.toString());@Crifano Stefano。你在这里做(后文本更改),我不认为这是正确的。)