我有一个“类别”列表存储在我的应用程序的ArrayAdapter中的字符串。这很简单。适配器是活动的一个字段,可以随处访问。它在onCreate()期间被赋值。AutoCompleteTextView和Spinner使用相同的适配器的问题
我有一个“Entry”对话框,其中包含使用此适配器的AutoCompleteTextView,并且工作得很好。这基本上是一个将新项目添加到列表的对话框。
我也有第二个对话框,它充当我的列表的过滤器,并有一个单一的微调器,当创建对话框时,使用相同的ArrayAdapter。这是问题。
如果在输入对话框前使用过滤器对话框,则微调器将填充来自适配器的所有项目。效果很好。
任何和每次我使用条目对话框时,AutoCompleteTextView都能正常工作。
如果我使用条目对话框并在AutoCompleteTextView中选择了一个项目,那么问题就出现了。在弹出窗口中选择一个建议项目后,即使我取消对话框中的项目,下一次启动过滤器对话框时,微调器最初显示最后从AutoCompleteTextView中选择的项目(而不是适配器中的第一项) ,并且如果点击/触摸,则只显示微调列表中的单个项目。解决这个问题的唯一方法是结束应用程序并重新打开它。我没有得到任何错误或任何有用的logcat。
编辑 - 好吧,我已经删除了以前的代码,用我制作的简单测试用例替换它。底线是,我想知道这是一个错误,还是如果它是预期的结果。当在AutoCompleteTextView中选择一个建议时,我可以确认链接到它的ArrayAdapter已应用过滤,以便计数受到影响,并且只有在微调器中访问适配器时显示的唯一项目才会被过滤到。我还添加了按钮以显示吐司以显示计数受到影响。在自动完成中键入“te”,选择测试条目。他们尝试微调或单击按钮,看看适配器的计数是只有2.
所以最后的问题是现在...可以重置适配器的筛选器(除键入和清除AutoCompleteTextView)?我找不到任何方法来做到这一点。我已经在我的实际应用程序中解决了这个问题,方法是设置一个临时适配器,复制主适配器项并将视图设置为使用临时适配器。我的手机正在运行2.2,并且我已经在仿真器中测试了2.3.3 API级别10。
为main.xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<AutoCompleteTextView android:id="@+id/actv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<Spinner android:id="@+id/spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
<Button android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Check It"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true" />
</RelativeLayout>
为MainActivity的代码的XML。java的
public class MainActivity extends Activity {
/** Called when the activity is first created. */
AutoCompleteTextView actv;
Spinner spinner;
Button button;
String [] adapterList = {"Test1", "Test2", "Garbage1", "Garbage2"};
ArrayAdapter<String> adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, adapterList);
actv = (AutoCompleteTextView) findViewById(R.id.actv);
spinner = (Spinner) findViewById(R.id.spinner);
button = (Button) findViewById(R.id.button);
actv.setAdapter(adapter);
spinner.setAdapter(adapter);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "" + adapter.getCount() + " Items in Adapter", Toast.LENGTH_SHORT).show();
}
});
}
}
邮政编码,尤其是您创建对话框的位。 – dmon 2011-05-10 03:49:08
我现在编辑了这个帖子几次。现在这篇文章包含了一个简单而容易复制的测试用例。 – Maximus 2011-05-10 19:09:50