gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:19:08 25 4
gpt4 key购买 nike

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

我有一个“条目”对话框,其中包含一个 AutoCompleteTextView,它使用这个适配器并且工作得很好。这基本上是一个向列表添加新项目的对话框。

我还有第二个对话框,它充当我的列表的过滤器,并有一个 Spinner,当创建对话框时,它使用相同的 ArrayAdapter。这就是问题所在。

如果我在条目 Dialog 之前使用过滤器 Dialog,则 Spinner 将填充来自适配器的所有项目。效果很好。

每次我使用条目对话框时,AutoCompleteTextView 都可以正常工作。

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

编辑 - 好的,我已经删除了以前的代码,用我制作的一个简单的测试用例替换它。底线是我想知道这是否是一个错误,或者它是否是预期的结果。在 AutoCompleteTextView 中选择建议时,我可以确认链接到它的 ArrayAdapter 已应用过滤,因此它的计数受到影响,并且如果在 Spinner 中访问适配器,则显示的唯一项目将是那些被过滤到.我还添加了按钮来显示 toast ,以表明计数受到影响。在自动完成中键入“te”,选择任一测试条目。他们尝试使用微调器或单击按钮以查看适配器的计数仅为 2。

所以最后一个问题是现在......可以重置适配器的过滤器(除了键入并清除 AutoCompleteTextView)吗?我找不到任何方法来做到这一点。我通过设置临时适配器、复制主要适配器项并将 View 设置为使用临时适配器来解决我的实际应用程序中的问题。我的手机运行的是 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();
}
});
}
}

最佳答案

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

让我知道它是否有效

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

关于android - 使用相同适配器的 AutoCompleteTextView 和 Spinner 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com