天天看點

android listView EditText擷取焦點

今天做項目,有一個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);
           

緻此功能算上出來了,折騰了一上午。

繼續閱讀