今天做项目,有一个listView界面,需要添加一个EditText输入。开始的思路为屏蔽所有子控件,由setOnItemClickListener总控制界面焦点
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
try {
Crops temp = crops.get(i);
temp.setSelete(!temp.isSelete());
ClearEditText a = (ClearEditText) view.findViewById(R.id.et3);
TextView c = (TextView) view.findViewById(R.id.tv2);
CheckBox b = (CheckBox) view.findViewById(R.id.cb1);
b.setChecked(temp.isSelete());
for (Crops crop : crops) {
crop.setOrderno(0);
}
if (b.isChecked()) {
// InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
// imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
a.clearFocus();
a.requestFocus();
a.setFocusable(true);
a.setFocusableInTouchMode(true);
temp.setOrderno(1);
} else {
temp.setOrderno(0);
a.setText("");
// a.setFocusable(false);
}
// machineAdapter.setList(crops);
// machineAdapter.notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
}
}
});
结果并不好,checkBox没有问题,但是EditText,无法获取焦点,不显示光标,也不弹输入框。强制弹出来也不是EditText的。各种尝试放弃这种思路。
采用子控件获取焦点方案,逻辑放在Adapter中。
尝试后,发现比想象中要简单,网上说的由于getView刷新导致editText无法获取焦点问题并没有出现。光标和焦点均正常。有两个简单问题需要解决:
一保存输入内容,界面刷新后手动赋值。
viewHolder.et3.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
((Crops) list.get(loc)).setMath(view.getText().toString().trim());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
((Crops) list.get(loc)).setMath(view.getText().toString().trim());
}
});
//手动赋值
viewHolder.et3.setText(a.getMath());
二输入框弹出关闭问题。
开始是用的
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
功能是当前输入框状态取反。现在需要的功能是点击输入弹出,点击下一个输入还是弹出,显然这种弹出方式不适合这里。
故采用单独的关:
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(),0);
单独的开:
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view,InputMethodManager.SHOW_IMPLICIT);
致此功能算上出来了,折腾了一上午。