请问各位,我有一个listview每一行都是由一个textview和editview组成的(比如共有16行)
当行数很多的时候出现了滚动条我重写了BaseAdapter代码如下
    public class MyAdapter extends BaseAdapter
    {
     private LayoutInflater mInflater;     public MyAdapter(Context context)
     {
         this.mInflater = LayoutInflater.from(context);
     }
    
@Override
public int getCount() {
// TODO Auto-generated method stub
    return item.size();
} @Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
    return null;
} @Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
    return 0;
} @Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
    ViewHolder holder = null;
    if (convertView == null)  
    {
                  holder = new ViewHolder();  
         convertView = mInflater.inflate(R.layout.list_view, null);
holder.Trmtype = (TextView)convertView.findViewById(R.id.Trm_type);
holder.Ermqty = (EditText)convertView.findViewById(R.id.Erm_qty);
convertView.setTag(holder);
    }
    else  
    {
         holder = (ViewHolder)convertView.getTag();
    }

    holder.Trmtype.setText((String)item.get(position).get("Trm_type"));
    holder.Ermqty.setText((String)item.get(position).get("Erm_qty"));
    holder.Ermqty.addTextChangedListener(new TextWatcher()
{ public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub

} public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
// TODO Auto-generated method stub
edit.setText(Integer.toString(position) + ":" + s.toString());
} public void onTextChanged(CharSequence s, int start,
int before, int count) {
}

});
return convertView;
}
    }
我给EditText写了TextChanged事件,可是为什么我在上下滑动的时候,没有改过EditText里面的值也触发了这个事件?

解决方案 »

  1.   

    是因为滚动时,listview中的最上面的item消失,convertView又重新指向新的item,导致原有的item成为无用的,被系统当作垃圾处理,使原有item中的editview的数据产生变化。
      

  2.   

    楼上说的有道理,我也觉得应该是会存在回收的问题我原先是自己定义了一个ArrayList<HashMap<String, Object>> item
    listview是显示item里的数据
    本来我是打算用EditView的onTextChanged事件中也同时还去修改我的item的值
    可是现在他在回收垃圾的时候也会触发这个事件,那应该用什么方法去处理?
      

  3.   

    顶一下 大家帮忙看看 一般listview里有EditText是怎么处理的?
      

  4.   

    其实工程文件没什么特别的
    我是在一个listview中每一行都放了一个textview和EditText, 然后textview和edittext上都是有内容的 当listview出现了滚动条后 如果某个edittext被滚动到看不见的位置 再滚回来时 它里面填的内容就没有了 , 这个应该是因为垃圾回收的问题,  所以我就用一个ArrayList先来存放数据 然后重写baseadapter的getView
    这样这个问题是解决了
    但是 第二个问题 我如果修改了EditText的值 他滚动回来后会根据ArrayList中的值还原成没有修改之前的值, 请问这个怎么处理?
      

  5.   

    这个问题你依然可以参照第一个问题解决的方式,是必须记录你修改过的值再次展现的时候setText你修改的值,给你一个思路,你可以在getVIew里面设置一个标识,判断是不是编辑状态,每次每条Item的getView都要匹配你那个记录改变值的集合,如有变化就赋值。顺便说一下这个情况很常见是正常的。。思路就一个:记录变化值。。
      

  6.   

    做一个list用来存储edittext里的值,每次getview的时候都先判断list是否有值,如果有就设置到edittext里
      

  7.   

    还有个想法就是你在使用onTextChanged事件的时候可以判断一下组件是否有交点,因为只有在有交点的时候发生的变化才是希望调用监听的地方
      

  8.   

    请问怎么判断是不是编辑状态?
    其实记录修改的值什么的都没什么问题。
    现在的问题主要是因为垃圾回收的时候也会触发onTextChanged, 在TextView中更改值也会触发
    我就没办法区分究竟哪个才是在修改,哪个是在回收
      

  9.   

    你可以设置一个 boolean啊,总之 就是你在BaseAdapter的getView里面判断这一个是不是被编辑过,你首先要有一个数据结构,其实就是一个类,记录一些值,不管是你修改的什么只要修改就记录。然后每一次setText的时候比较这个集合和当前值是不是一样不一样就是要你修改的值。这样就可以了 ,具体逻辑你自己实现 我之前也遇到这个问题就是这样解决的
      

  10.   

    另外 EditText修改建议你使用editText_1.addTextChangedListener(new TextWatcher(){})。这个很有效果 。。
      

  11.   

    有修改就有记录是可以做到的,但是现在的问题是我没有办法区分什么时候是垃圾回收修改的什么时候是编辑edittext修改的
    比如我listview有8个item  UI上只显示3个,  当你手指点住listview往上滑动,让第4个item出现,第一个item消失他就会触发ontextchanged事件了,可是如果我这个时候记录就变成了是第一个item在修改
      

  12.   

    记录了 你就不用判断是什么状态了 。。即:每次getView的时候就判断 和记录集合里面的值是不是一样,不一样就赋值。
      

  13.   

    不一样就赋值会产生错误比如说原来只显示3个item每个item上都是一个EditText
    item1 中EditText的值是 "111"
    item2 中EditText的值是 "222"
    item3 中EditText的值是 "333"
    根据listView的原理
    在滑动listveiw让item1消失,item4出现的时候listview其实是不会去生成一个item4,而是变成
    item2 -> "222"
    item3 -> "333"
    item1 -> "444"
    那这个时候他就触发了ontextchanged,因为原来的item1中EditText的值是111而现在变成了444,在发生变化的时候position是1, 如果这个是后我去修改了, 那我的list里就把第一个值修改成了444,这个其实是错的
      

  14.   

    所以还是那个问题 有什么办法区分什么时候确实是我编辑EditText修改而触发的EditText的ontextchanged而什么时候是上面的情况触发的, 因为只有在确实是编辑EditText的时候我才去改变我存在一边的list中的值
      

  15.   

    我最近也在研究用ListView实现类似Execl表格,你的问题是否可以做成:在EditText处于焦点状态时,不运行滑动屏幕;当用户输入完数据,并通过按回车或别的确认方式,确认TextChanged后,再运行滑动屏幕。