Почему мой AutoCompleteTextView не работает? - PullRequest
0 голосов
/ 19 октября 2019

Это кажется странным, так как обычно виджеты работают, поскольку они должны . У меня есть AutoCompleteTextView, который я хочу заполнить списком названий городов. Это кажется простым, но не работает так, как я собираюсь. Вот результирующий вывод:

enter image description here

Вот схема на рисунке:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity1">

    <AutoCompleteTextView
        android:id="@+id/autocomptv_city_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="12dp"
        android:layout_marginEnd="20dp"
        android:layout_marginRight="20dp"
        android:background="@drawable/bg_edittext_rect_opd"
        android:hint="Select City"
        android:text=""
        android:inputType="text"
        android:maxLines="1"
        android:completionThreshold="0"
        android:padding="10dp"
        android:singleLine="true"
        android:textColor="#000000"
        android:textSize="15sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

А ниже приведен код Java длято же самое:

public class MainActivity1 extends AppCompatActivity {

    AutoCompleteTextView mAutCompleteTextViewSelfCity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);

        mAutCompleteTextViewSelfCity = ((AutoCompleteTextView) findViewById(R.id.autocomptv_city_list));

        setupCityDropdownwidget();
    }

    private void setupCityDropdownwidget() {
        Type listType = new TypeToken<List<CityName>>() {}.getType();
        List<CityName> citiesList = Singletons.getGsonInstance().fromJson(TestData.cityDataJson, listType);

        CityArrayAdapter adapter = new CityArrayAdapter(this, R.layout.item_spinner_city, citiesList);
        mAutCompleteTextViewSelfCity.setAdapter(adapter);
        adapter.notifyDataSetChanged();

        mAutCompleteTextViewSelfCity.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CityName selectedCitySelf = ((CityName) parent.getItemAtPosition(position));
                mAutCompleteTextViewSelfCity.setText(selectedCitySelf.getCityName());
            }
        });
    }
}

Проблема:

Хорошо, я хочу, чтобы представление было таким, чтобы, как только пользователь нажимал на него, отображалось выпадающее менюгорода, и когда пользователь начинает вводить свой город для фильтрации, представление продолжает показывать суженные предложения для одного и того же.

В настоящее время единственное, что он может предложить, - это когда я что-то набираю и очищаю текстПосмотреть. Если я изменяю порог завершения на 1, предложения не отображаются когда-либо .

Что не так с моим кодом?

Вот полный источник для справки: https://wetransfer.com/downloads/ce4017f5f2488288ef7494dc029e033420191019092536/7afa9a3e64afb257293533bd634d6c3220191019092536/dc2341

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Таким образом, в конечном счете, речь шла об основах - элемент данных, с которым работает ArrayAdapter, должен обеспечить значимое переопределение toString(). Это то, чего не хватало в моей реализации.

Из документов:

По умолчанию адаптер массива создает представление, вызывая Object#toString() для каждого объекта данных в коллекцииВы предоставляете, и помещаете результат в TextView.

Я потратил немного времени, но опыт и знания наверняка пригодятся когда-нибудь.

0 голосов
/ 19 октября 2019

Вам не нужно устанавливать adapter.notifyDataSetChanged();, просто установите адаптер, и все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...