输入后,它会提示我:您的应用没有响应。 您要关闭吗? 等待OK
我认为是由于edt_search.gettext().tostring()
内的setData()
private void setupViews() {
edt_search = findViewById(R.id.edt_search);
progress = findViewById(R.id.progress);
progress.hide();
edt_search.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() != 0) {
setData();
}
}
});
}
private void setData() {
AndroidNetworking.post("uri")
.addBodyParameter("word", edt_search.getText().toString())
.build()
.getAsObjectList(Search.class, new ParsedRequestListener<List<Search>>() {
@Override
public void onResponse(List<Search> searches) {
for (Search search : searches) {
searchList.add(search);
adapter.notifyDataSetChanged();
}
loading(false);
}
@Override
public void onError(ANError anError) {
Log.e("android-networking", "error: " + anError.getLocalizedMessage());
}
});
}
答案 0 :(得分:1)
您可能猜对了。根据经验,我发现在afterTextChanged
方法内从EditText调用方法是有问题的(至少没有先删除文本监视程序)。如果可能的话,最好使用作为参数传递的Editable对象。因此,您可以尝试两种方法:
首先(最简单的方法,在这种情况下,我最推荐这样做):将字符串传递给setData()方法,因此您无需使用此方法访问EditText:
....
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() != 0) {
setData(editable.toString());
}
}
....
private void setData(String searchString) {
AndroidNetworking.post("http://akhbaresteghlal.ir/search/getInformations.php")
.addBodyParameter("word", searchString)
.build()
....
第二个选项(如果出于任何原因,您绝对需要直接访问editText):在调用setData()(以及EditText中的任何方法)之前,请先删除TextWatcher,然后再添加它。
....
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() != 0) {
edt_search.removeTextChangedListener(this);
setData();
edt_search.addTextChangedListener(this);
}
}
....
private void setData() {
AndroidNetworking.post("http://akhbaresteghlal.ir/search/getInformations.php")
.addBodyParameter("word", edt_search.getText().toString())
.build()
....
希望有帮助!