文档章节

Android开发中ListView与EditText的冲突汇总

 邮币财富-张起荣
发布于 2017/09/07 10:32
字数 592
阅读 8
收藏 0

在安卓开发的过程中,遇到了listview碰见item中有edittext嵌套的问题,刚开始讨论的时候感觉这还不是很简单的事,实际操作中遇到了各式各样的问题

 

点击EditText弹出软键盘导致EditText焦点丢失和文本重置问题

问题描述:点击EditText,弹出软键盘,会导致ListView调用getView()重绘,从而导致本来应该在EditText上的焦点被刷新而消失了,从而在软键盘上输入任何文字都没有显示没有效果,必须再点击一次EditText才会有焦点,并且无论输入什么内容隐藏软键盘后再次由于重绘又变回原来的文本内容。

 

解决方案

定义一个整型变量来标志点击的是哪个EditText:

private int index = -1;  

 

在getView中为EditText添加onTouch事件:

 

  1. rightEt.setOnTouchListener(new View.OnTouchListener() {  
  2.         @Override  
  3.         public boolean onTouch(View v, MotionEvent event) {  
  4.             if (event.getAction() == MotionEvent.ACTION_UP) {  
  5.                 index = position;  
  6.             }  
  7.             return false;  
  8.         }  
  9. }); 

在getView()的结尾处判断当前绘制的Item的position是不是刚才点击的那个EditText:

 

  1. rightEt.clearFocus();  
  2. if(index != -1 && index == position){  
  3.      //强制加上焦点  
  4.      rightEt.requestFocus();  
  5.      //设置光标显示到编辑框尾部  
  6.      rightEt.setSelection(rightEt .getText().length());  
  7.      //重置  
  8.      index = -1;  
  9. }  

思路:点击某个Item里的EditText,将该Item的position赋给index,弹出软键盘之后,ListView全部重新绘制,每次调用getView时都进行判断当前绘制的Item是否是点击的那个EditText所在的Item,如果是,则将该EditText对焦,并设置光标显示于文本尾部。

 

解决了焦点问题,还需要解决EditText文本被重新绘制问题:

为EditText设置OnFocusChangeListener事件:

 

 

  1. rightEt.setOnFocusChangeListener(new View.OnFocusChangeListener() {  
  2.     @Override  
  3.     public void onFocusChange(View v, boolean hasFocus) {  
  4.         if(!hasFocus){  
  5.             datas.get(position).setStrRightTv(rightEt.getText().toString());  
  6.         }  
  7.     }  
  8. });  

思路:一旦失去了焦点,就用此时的EditText上的文本内容去更新数据源。

ListView与EditText多行文本时的滑动冲突问题

问题描述:当EditText嵌套在ListView中且EditText设置是多行文本时,EditText本身内容本应该自带滚动效果,但当点击EditText内部滑动的时候,发现失效,这是由于外层的ListView拦截了它的子控件EditText的事件导致的。

解决方案

 

 

  1. mEditText.setOnTouchListener(this);    
  2.     
  3. @Override    
  4. public boolean onTouch(View v, MotionEvent event) {    
  5.     switch (v.getId()) {    
  6.         case R.id.edit_text:    
  7.             v.getParent().requestDisallowInterceptTouchEvent(true);    
  8.             switch (event.getAction()) {    
  9.                 case MotionEvent.ACTION_UP:    
  10.                     v.getParent().requestDisallowInterceptTouchEvent(false);    
  11.                     break;    
  12.             }    
  13.     }    
  14.     return false;    
  15. }    

© 著作权归作者所有

粉丝 0
博文 27
码字总数 11099
作品 0
包头
私信 提问
为什么listview绑定的数据为空

// 为点菜列表ListView绑定数据的方法 private void setMenusAdapter(){ lv = (ListView) findViewById(R.id.orderDetailListView01); // 获得EditText,CODE EditText code_et = (EditText......

sd_sd
2013/07/04
618
1
Android开源实战:一个简单 & 好用的搜索框(含历史搜索记录)

前言 Android开发中,类似下图的搜索功能非常常见 搜索功能 今天,我将手把手教大家实现一款封装了 历史搜索记录功能 & 样式的Android自定义搜索框 开源库,希望你们会喜欢。 示意图 已在Git...

BillyLu1994
2018/04/28
0
0
Android常见小问题汇总

1 问题: 登陆页面 输入时账号时 弹出键盘覆盖 密码输入框 期望:输入能够把输入页面顶上去。 解决方法:Activity设置成非全屏且:android:windowSoftInputMode = "adjustResize" 2 问题:点...

510202
2014/11/18
0
0
保存activity的state

1.正常结束activity(back键和finish())下的保存数据: onPause():用于保存数据操作, 原因:onPause()和onResume()是在activity中必定会执行的。 onStop()不一定会执行。 2.系统因为内存不足...

新根
2015/07/20
99
0
怎么解决ListView,EditText,CheckBox三个共存的焦点问题??

当我不加任何 android:focusable="true" 的时候, CheckBox,和EditText能获取到焦点,而EditText获取不到焦点。。 而当我 EditText的焦点加上: android:focusable="true" 的时候, CheckB......

mimixi666
2014/01/15
2.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部