2011-05-10 24 views
2

我有一个“类别”列表存储在我的应用程序的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(); 
      } 
     }); 
    } 
} 
+0

邮政编码,尤其是您创建对话框的位。 – dmon 2011-05-10 03:49:08

+0

我现在编辑了这个帖子几次。现在这篇文章包含了一个简单而容易复制的测试用例。 – Maximus 2011-05-10 19:09:50

回答

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; 

(参见AutoCompleteTextView中的setAdapter方法,在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

让我知道,如果它

顺便说一句,在适配器会动态改变?对于两个适配器来说,“解决方法”可能是一个更好的选择,而不是搞过滤器。如果用户启动一个单词,然后单击微调器,取消它并返回到单词?现在自动完成是没有意义的,除非您保存过滤器并以某种方式恢复。
我确实认为两个适配器(基于相同的字符串数组)是更好的解决方案

+0

我可能会坚持我的工作。在我的实际应用程序中,自动完成视图和微调控件位于单独的对话框中,因此它们绝不会同时处于屏幕上。这只是我正在寻找的答案,非常感谢。你将在23小时内获得赏金......如果你有一个时刻并且对布局有好处,请看看我最新的问题...... – Maximus 2011-05-12 16:15:48

+0

@Maximus我会在家尝试(我没有sdk这里)。我刚刚在“相关”列中发现了这个问题:http://stackoverflow.com/questions/5504657/how-to-remove-the-filter-on-an-arrayadapter-used-in-an-autocompletetextview(不同的问题,类似的问题) – Aleadam 2011-05-12 16:34:11

+0

@Maximus顺便说一句,你有一整周的赏金。如果你想要,你可以等待,看看别人是否有更好的解决方案。 – Aleadam 2011-05-12 16:41:53