输入NIK字段完成后自动在TextView中显示对应NAMA的实现方法
实现EditText输入NIK后自动加载对应NAMA到TextView的正确方案
需求说明
我有EditText和TextView组件,EditText用于输入NIK,TextView用于显示对应的NAMA。需求是输入完成NIK后,自动从数据库获取匹配的NAMA并显示到TextView中,目前不清楚正确的实现方式。
数据库结构
| NIK | NAMA |
|---|---|
| 96296 | Farrasta |
| 94878 | Alfian |
现有代码
EditText监听代码
etNik.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String data = etNik.getText().toString(); if (data == NikKry){ getNama(); } } @Override public void afterTextChanged(Editable s) { } });
获取NAMA的函数
private void getNama(){ APIRequestData armNama = RetroMaster.konekRetrofit().create(APIRequestData.class); Call<List<DataMaster>> tampilNama = armNama.ardGetNama(NikKry); tampilNama.enqueue(new Callback<List<DataMaster>>() { @Override public void onResponse(Call<List<DataMaster>> call, Response<List<DataMaster>> response) { if (response.isSuccessful()) { tvNama.setText(response.body().get(0).getNAMA()); } } @Override public void onFailure(Call<List<DataMaster>> call, Throwable t) { Toast.makeText(TambahActivity.this, "Gagal "+t.getMessage(), Toast.LENGTH_SHORT).show(); } }); }
现有代码问题分析
- 字符串比较错误:Java中用
==比较字符串是对比对象引用,不是内容,应该用equals()或equalsIgnoreCase()。 - 触发时机不合理:
onTextChanged会在输入过程中每次字符变化都触发,容易导致频繁接口请求,应该在输入完成后再触发。 - 空数据处理缺失:
response.body()或返回的列表可能为空,直接get(0)会引发空指针异常。 - 变量传递错误:
getNama()中使用的NikKry未同步为当前输入的NIK值,需要将输入的NIK作为参数传入函数。
修正后的实现方案
方案1:输入框失去焦点时触发查询
适合输入完成后点击其他区域触发的场景:
etNik.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { String inputNik = etNik.getText().toString().trim(); if (!inputNik.isEmpty()) { getNama(inputNik); } else { tvNama.setText(""); // 清空显示 } } } });
方案2:输入固定长度NIK后自动触发(假设NIK为5位)
适合NIK长度固定的场景:
etNik.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String inputNik = s.toString().trim(); // 输入长度符合NIK规则时触发查询 if (inputNik.length() == 5) { getNama(inputNik); } else if (inputNik.length() < 5) { tvNama.setText(""); // 长度不足时清空显示 } } @Override public void afterTextChanged(Editable s) {} });
修正后的getNama函数
private void getNama(String nik) { APIRequestData armNama = RetroMaster.konekRetrofit().create(APIRequestData.class); Call<List<DataMaster>> tampilNama = armNama.ardGetNama(nik); tampilNama.enqueue(new Callback<List<DataMaster>>() { @Override public void onResponse(Call<List<DataMaster>> call, Response<List<DataMaster>> response) { if (response.isSuccessful() && response.body() != null && !response.body().isEmpty()) { tvNama.setText(response.body().get(0).getNAMA()); } else { tvNama.setText("未找到匹配的NAMA"); // 无匹配数据时提示 } } @Override public void onFailure(Call<List<DataMaster>> call, Throwable t) { Toast.makeText(TambahActivity.this, "获取数据失败:" + t.getMessage(), Toast.LENGTH_SHORT).show(); tvNama.setText(""); } }); }
额外优化建议
- 添加加载状态:请求接口时显示ProgressBar,避免用户重复操作。
- 防抖处理:如果使用实时输入监听,添加500ms左右的延迟触发,减少无效接口请求。
- 输入验证:检查输入的NIK是否为纯数字,避免非法请求。
内容的提问来源于stack exchange,提问作者Farrasta K S
相关产品推荐
相关产品推荐

