好久没有更新博客了,好像从开始工作以来,就没有折腾这些东西了。
刚好今天遇到个问题,正好记录下来

问题

在ListView当中使用EditView时,第一次点击,会弹出小键盘,然后焦点就消失了。

分析

第一次点击EditView,弹出小键盘,ListView会调用getView()刷新,然后EditView的焦点就飞了。。。第二次点击,小键盘已经存在,所以不会调用再次刷新,所以焦点不会消失了

思路

每次失去焦点之前记录当前View和光标位置,下次调用getView的时候恢复

解决方法

目前我用的下面的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 定义两个标记位
private int selectIndex = -1; //当前item的位置
private int currentSelection = 0;//偏移量

// 然后在getView中添加EditView焦点变化的事件,用来记录标记位
viewHolder.editView.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean arg1) {

if(arg1==false){
selectIndex = position;
currentSelection = ((EditText)view).getSelectionStart();
}
}
});

// 在重新绘制View的时候使用该标记位
if(position == selectIndex){
viewHolder.editView.requestFocus();
viewHolder.editView.setSelection(currentSelection);
}

记住虽然你记录了位置,但是数据并没有记录,每次刷新会重新赋值ListView上的值,需要的话记得保存起来

特技


其实,处理焦点失去还有个更简单的方法,只是有点小瑕疵(如果ListView的下面还有个EditView,会被挤到上面去)

如下

在manifest文件的该ListView所在Activity里添加这一句

1
android:windowSoftInputMode="adjustResize"

你可以试试,确实有效,但是不适合我

还有,我发现这问题,淘宝是用的弹出输入框,哪天试试