AutoCompleteTextView 不更新 arrayadapter 项目
AutoCompleteTextView doesn't update arrayadapter items
以下应用程序流程显示了我的预期(自动完成列表中的"Alfa"):
打开应用程序 -> 点击按钮 -> 点击自动完成字段 -> 输入 "al"
但是这个失败了(如果我输入 "br","Bravo" 仍然在列表中):
打开应用程序 -> 点击自动完成字段 -> 输入任何内容然后将其删除 -> 单击按钮 -> 点击自动完成字段 -> 输入 "al"
为什么第二个序列没有更新列表?
public class DisplayFragment extends Fragment {
AutoCompleteTextView autoCTVShop;
Button buttonSend;
String[] names= {"Bravo","Charlie","Delta","Foxtrot"};
ArrayAdapter<String> adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_display, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
autoCTVShop = (AutoCompleteTextView) getActivity().findViewById(R.id.autoCompleteTextViewShop);
adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),
android.R.layout.simple_list_item_1, names);
autoCTVShop.setAdapter(adapter);
buttonSend = (Button) getActivity().findViewById(R.id.buttonSend);
buttonSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//The following two lines don't work as I expected
names[0]="Alfa";
adapter.notifyDataSetChanged();
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
}
fragment_display.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<AutoCompleteTextView
android:id="@+id/autoCompleteTextViewShop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:imeOptions="actionNext"
android:singleLine="true" />
<Button
android:id="@+id/buttonSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:enabled="true"
android:text="Button" />
</LinearLayout>
谢谢。
我很确定它区分大小写。试试艾尔……可能就是这样。也可能是因为您要替换名称。我不确定,但是当您传递名称时,它可能会将其设置为不会同时更新的实例变量。所以你需要重新遍历数组。
ArrayAdapter
在内部使用 2 个列表来存储和处理项目。最初,您传入的项目通过名为 mObjects
的列表存储和处理。对外部 names
对象的任何更改也会反映在 mObjects
列表中。
一旦您开始过滤,就会创建第二个名为 mOriginalValues
的列表。在过滤流程中,mObjects
将用作 "current values" 容器,而 mOriginalValues
将用作 "reset to and re-filter" 容器。更改 names
值将不再有影响。您可以直接更改适配器值(adapter.insert(...)、adapter.remove(...) - 它会修改 mOriginalValues
)或重新创建适配器
以下应用程序流程显示了我的预期(自动完成列表中的"Alfa"):
打开应用程序 -> 点击按钮 -> 点击自动完成字段 -> 输入 "al"
但是这个失败了(如果我输入 "br","Bravo" 仍然在列表中):
打开应用程序 -> 点击自动完成字段 -> 输入任何内容然后将其删除 -> 单击按钮 -> 点击自动完成字段 -> 输入 "al"
为什么第二个序列没有更新列表?
public class DisplayFragment extends Fragment {
AutoCompleteTextView autoCTVShop;
Button buttonSend;
String[] names= {"Bravo","Charlie","Delta","Foxtrot"};
ArrayAdapter<String> adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_display, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
autoCTVShop = (AutoCompleteTextView) getActivity().findViewById(R.id.autoCompleteTextViewShop);
adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),
android.R.layout.simple_list_item_1, names);
autoCTVShop.setAdapter(adapter);
buttonSend = (Button) getActivity().findViewById(R.id.buttonSend);
buttonSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//The following two lines don't work as I expected
names[0]="Alfa";
adapter.notifyDataSetChanged();
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
}
fragment_display.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<AutoCompleteTextView
android:id="@+id/autoCompleteTextViewShop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:imeOptions="actionNext"
android:singleLine="true" />
<Button
android:id="@+id/buttonSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:enabled="true"
android:text="Button" />
</LinearLayout>
谢谢。
我很确定它区分大小写。试试艾尔……可能就是这样。也可能是因为您要替换名称。我不确定,但是当您传递名称时,它可能会将其设置为不会同时更新的实例变量。所以你需要重新遍历数组。
ArrayAdapter
在内部使用 2 个列表来存储和处理项目。最初,您传入的项目通过名为 mObjects
的列表存储和处理。对外部 names
对象的任何更改也会反映在 mObjects
列表中。
一旦您开始过滤,就会创建第二个名为 mOriginalValues
的列表。在过滤流程中,mObjects
将用作 "current values" 容器,而 mOriginalValues
将用作 "reset to and re-filter" 容器。更改 names
值将不再有影响。您可以直接更改适配器值(adapter.insert(...)、adapter.remove(...) - 它会修改 mOriginalValues
)或重新创建适配器