我想在AutoCompleteTextView下面显示来自服务器的列表用户名和他们的电话号码作为建议。我不需要过滤器,因为我已经从服务器获取过滤器结果。我在AutoComleteTextView上添加了TextWatcher,它会调用API的每个文本更改。我制作了自定义适配器,但未显示任何内容。
ArrayList声明为全局
ArrayList<NameModel> nameList = new ArrayList<>();
AutoCompleteAdapter autoCompleteAdapter;
onCreate
autoCompleteAdapter = new AutoCompleteAdapter(this,nameList);
txtNumber.setAdapter(autoCompleteAdapter);
txtNumber.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 number = s.toString();
if (number.matches("^[0-9]*$") && number.length() == 10){
btnAdd.setVisibility(View.VISIBLE);
}else {
btnAdd.setVisibility(View.GONE);
GetNames(s);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
GetNames()
nameList.clear();
autoCompleteAdapter.notifyDataSetChanged();
String params = inst_id+"/?name="+text;
StringRequest stringRequest = new StringRequest(Request.Method.GET, getResources().getString(R.string.ipmain)+GET_NAME_URL+params, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray jsonArray = new JSONArray(response);
for (int i=0;i<jsonArray.length();i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("first_name")+" "+jsonObject.getString("last_name");
String role = jsonObject.getString("role");
String number = jsonObject.getString("phone_number");
NameModel nameModel = new NameModel(name,role,number);
nameList.add(nameModel);
}
autoCompleteAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
适配器-是父级的子类
private class AutoCompleteAdapter extends ArrayAdapter<NameModel> {
Context cntx;
ArrayList<NameModel> listGlobal;
AutoCompleteAdapter(@NonNull Context context, ArrayList<NameModel> list) {
super(context,R.layout.item_attendance,list);
cntx = context;
listGlobal = list;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
if (convertView == null){
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_attendance, parent, false);
}
TextView txtName = convertView.findViewById(R.id.txtName);
TextView txtRole = convertView.findViewById(R.id.txtGender);
TextView txtPhone = convertView.findViewById(R.id.txtPhone);
txtName.setText(listGlobal.get(position).getName());
txtRole.setText(listGlobal.get(position).getRole());
txtPhone.setText(listGlobal.get(position).getNumber());
return convertView;
}
@Override
public int getCount() {
Log.d("Adpter List:",String.valueOf(listGlobal.size()));
Log.d("Main List:",String.valueOf(nameList.size()));
return listGlobal.size();
}
}
第二个字母输入失败(第一个字母输入不显示任何内容)
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:411)
at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:349)
at android.widget.AutoCompleteTextView.buildImeCompletions(AutoCompleteTextView.java:1241)
at android.widget.AutoCompleteTextView.showDropDown(AutoCompleteTextView.java:1201)
at android.widget.AutoCompleteTextView.updateDropDownForFilter(AutoCompleteTextView.java:1084)
at android.widget.AutoCompleteTextView.-wrap2(AutoCompleteTextView.java)
at android.widget.AutoCompleteTextView$PopupDataSetObserver$1.run(AutoCompleteTextView.java:1409)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
答案 0 :(得分:0)
我认为您必须修改以下内容
1。。完成远程StringRequest之后,请确保使用新的nameList更新AutoCompleteAdapter。
2。。在调用autoCompleteAdapter = new AutoCompleteAdapter(this,nameList);之前,请确保数组列表具有值。
答案 1 :(得分:0)
尝试使Android Studio无效并重新启动。
或
删除.gradle,.iml,.idea文件并重建项目
答案 2 :(得分:0)
您有问题,因为您正在使用ArrayAdapter。 ArrayAdapter保留自己的列表并对其进行处理,因此当您在构造函数中提供列表时,适配器将创建一个副本并使用该副本来填充视图。更新列表对象时,适配器的副本不会更新,但是由于您覆盖了getCount方法并返回非零值,因此适配器尝试从空列表中获取项目。
解决方案:您应该改用BaseAdapter。或者,如果要使用ArrayAdapter,则应改用ArrayAdapter.add(),ArrayAdapter.clear()等修改适配器的列表。