为什么我的 AutoCompleteTextView 不工作?
Why is my AutoCompleteTextView not working?
这感觉很奇怪,因为小部件通常会按 应该 的方式工作。我有一个 AutoCompleteTextView
,我想用城市名称列表填充它。这看起来很简单,但并不像我打算的那样工作。这是结果输出:
图片布局如下:
<?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,则不会显示任何建议 ever.
我的代码有什么问题?
您无需设置 adapter.notifyDataSetChanged();
,只需设置适配器即可。
所以最终,它被证明是关于基础知识的——ArrayAdapter
使用的数据项应该提供有意义的 toString()
覆盖。这就是我的实施中所缺少的。
来自文档:
By default, the array adapter creates a view by calling
Object#toString()
on each data object in the collection you provide,
and places the result in a TextView
.
我确实浪费了一些时间,但这些经验和知识总有一天会派上用场的。
这感觉很奇怪,因为小部件通常会按 应该 的方式工作。我有一个 AutoCompleteTextView
,我想用城市名称列表填充它。这看起来很简单,但并不像我打算的那样工作。这是结果输出:
图片布局如下:
<?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,则不会显示任何建议 ever.
我的代码有什么问题?
您无需设置 adapter.notifyDataSetChanged();
,只需设置适配器即可。
所以最终,它被证明是关于基础知识的——ArrayAdapter
使用的数据项应该提供有意义的 toString()
覆盖。这就是我的实施中所缺少的。
来自文档:
By default, the array adapter creates a view by calling
Object#toString()
on each data object in the collection you provide, and places the result in aTextView
.
我确实浪费了一些时间,但这些经验和知识总有一天会派上用场的。