天天看点

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);
           

致此功能算上出来了,折腾了一上午。

继续阅读