Список предложений AutocompleteTextView не отображается - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу показать список пользователей и их телефонные номера с сервера в качестве предложения ниже AutoCompleteTextView.Мне не нужен фильтр, потому что я уже получаю результат фильтрации с сервера.Я добавил TextWatcher в AutoComleteTextView при каждом изменении текста, которое будет вызывать 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 голосов
/ 08 апреля 2019

попробуйте сделать недействительным и перезапустить Android Studio.

или

удалить файлы .gradle, .iml, .idea и перестроить ваш проект

0 голосов
/ 08 апреля 2019

У вас проблемы, потому что вы используете ArrayAdapter.ArrayAdapter хранит свой собственный список и работает с ним, поэтому, когда вы предоставляете список в конструкторе, адаптер создает копию и использует ее для заполнения представлений.При обновлении объекта списка копия адаптера не обновляется, но поскольку вы переопределяете метод getCount и возвращаете ненулевое значение, адаптер пытается извлечь элемент из пустого списка.

Решение: вам следует использоватьBaseAdapter вместо этого.Или, если вы хотите использовать ArrayAdapter, вам следует изменить список адаптера, используя вместо него ArrayAdapter.add (), ArrayAdapter.clear () и т. Д.

0 голосов
/ 08 апреля 2019

Я думаю, вам нужно изменить следующее

1. После выполнения удаленного запроса StringRequest убедитесь, что вы обновили AutoCompleteAdapter с новым nameList.

2. убедитесь, что список массивов имеет значения перед вызовом autoCompleteAdapter = new AutoCompleteAdapter (this, nameList);

...