Android开发中ListView与EditText的冲突汇总
2016-10-13 18:21
330 查看
在Android开发中,有时候会遇到ListView中嵌套了一些EditText的情况,这个时候很容易发生一些冲突问题,解决方案列举如下。
解决方案
定义一个整型变量来标志点击的是哪个EditText:
在getView中为EditText添加onTouch事件:
在getView()的结尾处判断当前绘制的Item的position是不是刚才点击的那个EditText:
思路:点击某个Item里的EditText,将该Item的position赋给index,弹出软键盘之后,ListView全部重新绘制,每次调用getView时都进行判断当前绘制的Item是否是点击的那个EditText所在的Item,如果是,则将该EditText对焦,并设置光标显示于文本尾部。
解决了焦点问题,还需要解决EditText文本被重新绘制问题:
为EditText设置OnFocusChangeListener事件:
思路:一旦失去了焦点,就用此时的EditText上的文本内容去更新数据源。
解决方案
思路:当发生某种触摸事件时,我们可以通过调用父控件的方法requestDisallowInterceptTouchEvent(true)来告诉父控件,我不需要你来处理这个事件,我自己可以处理。
点击EditText弹出软键盘导致EditText焦点丢失和文本重置问题
问题描述:点击EditText,弹出软键盘,会导致ListView调用getView()重绘,从而导致本来应该在EditText上的焦点被刷新而消失了,从而在软键盘上输入任何文字都没有显示没有效果,必须再点击一次EditText才会有焦点,并且无论输入什么内容隐藏软键盘后再次由于重绘又变回原来的文本内容。解决方案
定义一个整型变量来标志点击的是哪个EditText:
private int index = -1;
在getView中为EditText添加onTouch事件:
rightEt.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { index = position; } return false; } });
在getView()的结尾处判断当前绘制的Item的position是不是刚才点击的那个EditText:
rightEt.clearFocus(); if(index != -1 && index == position){ //强制加上焦点 rightEt.requestFocus(); //设置光标显示到编辑框尾部 rightEt.setSelection(rightEt .getText().length()); //重置 index = -1; }
思路:点击某个Item里的EditText,将该Item的position赋给index,弹出软键盘之后,ListView全部重新绘制,每次调用getView时都进行判断当前绘制的Item是否是点击的那个EditText所在的Item,如果是,则将该EditText对焦,并设置光标显示于文本尾部。
解决了焦点问题,还需要解决EditText文本被重新绘制问题:
为EditText设置OnFocusChangeListener事件:
rightEt.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus){ datas.get(position).setStrRightTv(rightEt.getText().toString()); } } });
思路:一旦失去了焦点,就用此时的EditText上的文本内容去更新数据源。
ListView与EditText多行文本时的滑动冲突问题
问题描述:当EditText嵌套在ListView中且EditText设置是多行文本时,EditText本身内容本应该自带滚动效果,但当点击EditText内部滑动的时候,发现失效,这是由于外层的ListView拦截了它的子控件EditText的事件导致的。解决方案
mEditText.setOnTouchListener(this); @Override public boolean onTouch(View v, MotionEvent event) { switch (v.getId()) { case R.id.edit_text: v.getParent().requestDisallowInterceptTouchEvent(true); switch (event.getAction()) { case MotionEvent.ACTION_UP: v.getParent().requestDisallowInterceptTouchEvent(false); break; } } return false; }
思路:当发生某种触摸事件时,我们可以通过调用父控件的方法requestDisallowInterceptTouchEvent(true)来告诉父控件,我不需要你来处理这个事件,我自己可以处理。
相关文章推荐
- android 开发-ListView与ScrollView事件冲突处理(事件分发机制处理)
- android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题
- android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题
- Android解决ListView中使用EditText所遇到的一些冲突
- Android开发中常用知识点( edittext、listview、填充屏幕等细节知识点)
- android开发之listview的样式设置汇总
- Android实际开发问题03------ListView中添加Edittext
- Android:ListView中包含EditText 文字冲突 复用 焦点 软键盘问题
- Android开发——解决ScrollView嵌套ListView的冲突
- Android开发之解决ListView和ScrollView滑动冲突的问题
- Android开发ListView中包含EditText控件遇到的问题
- Android解决ListView中使用EditText所遇到的一些冲突
- Android开发之旅一Listview的item中有edittext
- android开发之listview的样式设置汇总
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- android开发过程中遇到的一些问题(包括自定义ProgressBar, Intent, Animation, ListView, RadioButton)
- Android开发:实现popupwindow中显示listview
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- Android游戏开发教程汇总