今天做項目,有一個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);
緻此功能算上出來了,折騰了一上午。