AutocompleteTextView建议列表未显示

时间:2019-04-08 09:50:34

标签: android android-arrayadapter

我想在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)

3 个答案:

答案 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()等修改适配器的列表。