android如何为listview的每项中edittext控件添加textwacher
2015-05-13 17:16
453 查看
listview中的每项都有一个edittext,而且现在需要实时监听该edittext的输入,在listview的外部进行改变(例如用户修改单价,外部的总价需要变化)
添加监听器的代码:
还有需要注意的是在textwacher里面需要使用holder.position来表示当前edittext的位置,并且需要更新该holder的positioin
这时就要提到一个问题是,listview和gridview的getview 可能会调用多次,原因是如果listview的高度是wrap_content的话,listview就会去调用计算子view的高度,最后来计算listview的整体高度,所以造成会调用多次:
详细介绍
其实按照正常的角度来说,调用多次getview方法并没有什么错误,因为前面的getview方法返回的view并不会添加进入listview中,仅仅是用作计算高度,但是现在非常奇怪的现象是添加进listview中那个view里面的edittext的textwacher会回调很多次,而且回调内容很奇怪,不明原因,所以解决办法是修改textwacher里面的回调方法中加入
两个函数中的其中一个来标识该edittext的父view是否是被添加进listview中的那个view,暂时想到这个解决方法,具体原因也是不明白,有遇到的告诉小弟
还有一个是,listview嵌套listview,重写内层listview的onmeasure方法,结果是里面的listview会一次性调用所有项的getview方法,不会动态随着屏幕的移动而复用convertview,所以这时内层listview的edittext不会出现edittext输入了内容,拉倒屏幕外,再拉回这项之后,该edittext上次输入的内容没有保存的情况。但是如果单独一个listview+edittext就会出现这种情况,最好的办法就是定义一个map去保存每个edittext的输入值
添加监听器的代码:
public View getView(final int position, View arg1, ViewGroup arg2) { if (arg1 == null) { arg1 = inflater.inflate(R.layout.main_layout, null); final ViewHolder holder = new ViewHolder(); holder.position = position; holder.et_price.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void afterTextChanged(Editable arg0) { //do something use holder.position } }); arg1.setTag(holder); } final ViewHolder holder = (ViewHolder) arg1.getTag(); holder.position = position; return arg1; }这样就能够保证,每个edittext的textwacher不会被添加多次,而且listview滑动的时候也能够正确的工作
还有需要注意的是在textwacher里面需要使用holder.position来表示当前edittext的位置,并且需要更新该holder的positioin
这时就要提到一个问题是,listview和gridview的getview 可能会调用多次,原因是如果listview的高度是wrap_content的话,listview就会去调用计算子view的高度,最后来计算listview的整体高度,所以造成会调用多次:
详细介绍
其实按照正常的角度来说,调用多次getview方法并没有什么错误,因为前面的getview方法返回的view并不会添加进入listview中,仅仅是用作计算高度,但是现在非常奇怪的现象是添加进listview中那个view里面的edittext的textwacher会回调很多次,而且回调内容很奇怪,不明原因,所以解决办法是修改textwacher里面的回调方法中加入
if (!holder.et_price.getRootView().getClass().toString().contains("DecorView") || holder.et_price.getParent().getParent().getParent().getParent().getParent() == null) return; if (holder.et_price.getParent().getParent() == null) return;
两个函数中的其中一个来标识该edittext的父view是否是被添加进listview中的那个view,暂时想到这个解决方法,具体原因也是不明白,有遇到的告诉小弟
还有一个是,listview嵌套listview,重写内层listview的onmeasure方法,结果是里面的listview会一次性调用所有项的getview方法,不会动态随着屏幕的移动而复用convertview,所以这时内层listview的edittext不会出现edittext输入了内容,拉倒屏幕外,再拉回这项之后,该edittext上次输入的内容没有保存的情况。但是如果单独一个listview+edittext就会出现这种情况,最好的办法就是定义一个map去保存每个edittext的输入值
相关文章推荐
- android中的EditText如何屏蔽软键盘以及在屏蔽软键盘弹出其它对话框之类的控件的问题
- android_常用UI控件_02_EditText_01添加图片到edittext中
- 安卓Android控件ListView获取item中EditText值
- android如何改变editText控件中部分文字的格式
- android如何在textview或edittext上添加表情
- listview的edittext如何获得焦点,android 软键盘的显示与隐藏
- 『ANDROID』android EditText控件如何禁止输入内容
- android开发之如何消除EditText控件的边缘
- android动态加载控件(LinearLayout)并获取动态添加的EditText里的值
- Android中EditText如何去除边框添加下划线
- Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制(推荐)
- Android中EditText如何去除边框添加下划线
- Android EditText如何去除边框添加下划线
- Android控件ListView获取item中EditText值
- android开发:EditText如何正确自己实现删除和添加数据
- android开发:EditText如何正确自己实现删除和添加数据
- Android中EditText如何去除边框添加下划线
- Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制
- 【我的Android进阶之旅】如何隐藏Android中EditText控件的默认下划线
- android如何改变editText控件中部分文字的格式