ListView中含有EditText时候--要命的焦点问题迎刃而解
最近做项目的时候遇到了一个问题,就是在ListView的item上面含有一个EditText,要求是这样:
1当点击item的时候,item可以点击;
2当点击EditText的时候EditText也可以正常弹出软件盘;
当时真是把我给搞疯了,item可以点击的时候,EditText不能正常使用了,EditText好了的时候,item又不可点击了,当时那个火,心中一万句草泥马都出来了。言归正传,先看一下解决的效果:
当一个ListView的item中含有抢占焦点的控件的时候,我们通常在item的布局中加上这样一句:
android:descendantFocusability=”blocksDescendants”
防止抢占焦点,大多数情况下都能够解决问题,但是如果是EditText的时候,就很坑了,你会发现软件盘都不能够弹出,更别说输入文字了,要解决这个问题,就是让点击EditText的时候,item最外层不拦截点击事件就ok了,点解item的时候,在拦截点击事件也同样ok了。看getView中关键代码片段:
mHolder.edtInput.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((ViewGroup) v.getParent())
.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
return false;
}
});
这个是EditText的时候的处理
setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
这个很关键,而且是在OnTouchListener中执行的,因为在Android中View的触摸事件传递中,View的OnTouchListener调用是早于其他事件的,而且返回值false,代表目前事件没有被消耗,继续向下传递,不影响后续事件的处理(这里不影响EditText其他事件的处理)
convertView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((ViewGroup) v)
.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
Toast.makeText(mContext, "点击了item", Toast.LENGTH_LONG).show();
return false;
}
});
这个是convertView的处理,同样也是一行关键代码
.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
下面附上适配器中的代码和布局代码,需要的同学自己copy一下看看吧:
item布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvGroupTitle"
android:layout_width="0dip"
android:layout_height="50dip"
android:layout_weight="1"
android:gravity="center" />
<EditText
android:id="@+id/edtGroupContent"
android:layout_width="100dip"
android:layout_height="wrap_content" />
</LinearLayout>
BaseAdapter的代码:
public class NormalAdapter extends ArrayAdapter<String> {
private List<String> mDatas;
private Context mContext;
public NormalAdapter(Context context, List<String> objects) {
super(context, R.layout.activity_list, objects);
mDatas = objects;
mContext = context;
}
@Override
public View getView(final int position, View convertView,
final ViewGroup parent) {
Log.e("tag", parent.toString());
Holder mHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.item_group, null);
mHolder = new Holder();
mHolder.tvTitle = (TextView) convertView
.findViewById(R.id.tvGroupTitle);
mHolder.edtInput = (EditText) convertView
.findViewById(R.id.edtGroupContent);
convertView.setTag(mHolder);
} else {
mHolder = (Holder) convertView.getTag();
}
mHolder.tvTitle.setText(mDatas.get(position));
mHolder.edtInput.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((ViewGroup) v.getParent())
.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
return false;
}
});
convertView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((ViewGroup) v)
.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
Toast.makeText(mContext, "点击了item", Toast.LENGTH_LONG).show();
return true;
}
});
return convertView;
}
private static final class Holder {
TextView tvTitle;
EditText edtInput;
}
}
看看代码是不是解决问题了,可以的话,就给个赞吧!哈哈-^–^
ListView中含有EditText时候--要命的焦点问题迎刃而解的更多相关文章
- ListView 中含有 EditText 导致焦点丢失的问题
ListView 中的 item 中有 EditText 时. 如果activity的输入法选项设置为 android:windowSoftInputMode="adjustResize&q ...
- (转载)解决ListView中使用EditText所遇到的一些冲突
大家都知道在listView中使用editText,在输入过程中是有冲突的.今天稍微研究了一下这个问题,有一点点小小的心得和大家一起分享下. 首先建立一个最简单的demo,主界面就是一个ListVie ...
- 关于ListView中包含EditText数据复用引起异常的解决方案
概述 前几天测试提了一个bug,在ListView中添加留言信息,导致错乱的问题.实际上就是ListView需要添加一个EditText,复用导致错乱的问题,这个问题以前也遇到过.诸如,ListVie ...
- [Android学习笔记]ListView中含有Button导致无法响应onItemClick回调的解决办法
转自:http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html 问题描述: 当ListView的Item中的控件只是一些展示类 ...
- 在ListView中添加EditText丢失光标问题解决
<ListView android:id="@android:id/list" android:layout_height="fill_parent& ...
- android ListView中含有按钮事件实时更新ListView数据案例
1.布局文件Listview <?xml version="1.0" encoding="utf-8"?> <android.support. ...
- 【Android】ListView中EditText焦点问题
一.描述: 近期一个项目中需要开发一种类似表格的界面来显示和配置参数,Android并无直接类似表格的控件支持,我采用了ListView中布局EditText和TextView来实现,其中TextVi ...
- android中自定义的dialog中的EditText无法弹出输入法解决方案
1.解决无法弹出输入法: 在show()方法调用之前,用dialog.setView(new EditText(context))添加一个空的EditText,由于是自定义的AlertDialog,有 ...
- ListView 中的TextView实现跑马灯效果
案例:怎么样在一个ListView中含有TextView的item中实现字母滚动呢.这个在一些特定的场合经常用得到.如下图,当焦点位于某个item的时候其内容就自动滚动显示 要实现这样的效果,废话不多 ...
随机推荐
- macbook pro上安装虚拟机
第一步:下载MacHunter的app应用商店 第二步:在MacHunter内下载Parallels Desktop虚拟机 第三步:如果在这个商店下载不下来,在网络资源上直接下载Parallels D ...
- 【Codeforces 582A】 GCD Table
[题目链接] 点击打开链接 [算法] G中最大的数一定也是a中最大的数. G中次大的数一定也是a中次大的数. 第三.第四可能是由最大和次大的gcd产生的 那么就不难想到下面的算法: ...
- HNOI2008 GT考试 (KMP + 矩阵乘法)
传送门 这道题目的题意描述,通俗一点说就是这样:有一个长度为n的数字串(其中每一位都可以是0到9之间任意一个数字),给定一个长度为m的模式串,求有多少种情况,使得此模式串不为数字串的任意一个子串.结果 ...
- EasyUI 表格点击右键添加或刷新 绑定右键菜单
例1 在HTML页面中设置一个隐藏的菜单(前提是已经使用封装的Easyui) 代码: <div id="contextMenu_jygl" class="easyu ...
- HDU 5884 Sort (二分+k叉哈夫曼树)
题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...
- (水题)洛谷 - P1036 - 选数
https://www.luogu.org/problemnew/show/P1036 $n$ 才20的数据量,我当时居然还在想怎么分组组合,直接 $2^{20}$ 暴力搞就行了. $x_i $太大了 ...
- IEnumerable<T> 的时候一个主意事项p
IEnumerator IEnumerable.GetEnumerator() { return _vtDataView.GetEnumerator(); } public IEnumerator&l ...
- 《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法
<编译原理>-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 此编译原理确定某高级程序设计语言编译原理,理论基础,学习笔记 本笔记是对教材< ...
- hadoop wordcount程序缺陷
在wordcount 程序的main函数中,没有读取运行环境中的各种参数的值,全靠hadoop系统的默认参数跑起来,这样做是有风险的,最突出的就是OOM错误. 自己在刚刚学习hadoop编程时,就是模 ...
- 本周学习总结(ng-zorro/MDN索引/读书笔记)
按钮 <button ng-button nzType="primary">Primary</button> nzType="" pri ...