AutoCompleteTextView和Spinner使用相同的适配器时出现问题

时间:2011-05-10 01:40:50

标签: android

我有一个“类别”列表,在我的应用程序中的ArrayAdapter中存储为字符串。这很简单。适配器是Activity的一个字段,可以随处访问。它在onCreate()期间填充了值。

我有一个“Entry”对话框,其中包含一个AutoCompleteTextView,它使用此适配器并且运行良好。这基本上是一个用于向列表添加新项目的对话框。

我还有第二个Dialog,它作为我的列表的过滤器,并且有一个Spinner,当创建Dialog时,它使用相同的ArrayAdapter。这是问题所在。

如果我在条目对话框之前使用过滤器对话框,Spinner将填充适配器中的所有项目。效果很好。

任何时候我使用条目对话框,AutoCompleteTextView都能正常工作。

如果我使用条目Dialog并在AutoCompleteTextView中显示某些内容时选择了一个项目,则会出现问题。在弹出窗口中选择建议项目后,即使我取消条目对话框,下次调出过滤器对话框时,Spinner最初会显示上次从AutoCompleteTextView中选择的项目(而不是适配器中的第一项) ,并且仅在单击/触摸时显示Spinner列表中的单个项目。解决它的唯一方法是结束应用程序并重新打开它。我没有在logcat中得到任何有用的错误或任何内容。

编辑 - 好的,我删除了以前的代码,用我生成的简单测试用例替换它。最重要的是,我想知道这是一个错误,还是如果它是预期的结果。当在AutoCompleteTextView中选择一个建议时,我可以确认链接到它的ArrayAdapter已应用过滤,以便它的计数受到影响,并且如果在Spinner中访问适配器,则显示的唯一项目将被过滤到。我还添加了按钮来显示一个吐司,以显示计数受到影响。在自动填充中键入“te”,选择“测试条目”。他们尝试微调器或单击按钮以查看适配器的计数仅为2。

所以现在最后一个问题是......可以重置适配器的过滤器(除了输入并清除AutoCompleteTextView)吗?我找不到任何方法来做到这一点。我通过设置临时适配器,复制主适配器项目以及设置视图以使用临时适配器来解决实际应用中的问题。我的手机运行2.2,我在模拟器中测试了高达2.3.3 API级别10。

main.xml的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.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();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:1)

查看AutoCompleteTextView源代码,它会过滤ArrayAdapter:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/widget/AutoCompleteTextView.java#AutoCompleteTextView.performFiltering%28java.lang.CharSequence%2Cint%29

您可能想要在微调器中的onClick回调中删除过滤器:

Filter filter = adapter.getFilter();
filter = null;

(请参阅setAdapter中的AutoCompleteTextView方法,第600行附近)

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/widget/ArrayAdapter.java#ArrayAdapter.getFilter%28%29

让我知道它是否有效

BTW,适配器会动态变化吗?两个适配器的“解决方法”可能比搞乱过滤器更好。如果用户开始一个单词,然后单击微调器,取消它并返回到单词,该怎么办?现在自动完成没有意义,除非您保存过滤器并以某种方式恢复它 我相信两个适配器(基于相同的字符串数组)是更好的解决方案