作为标题,如何删除 AutoCompleteTextView 使用的 ArrayAdapter 上的过滤以获取原始列表?
多一点背景:
这一切都始于一个可悲的事实,即传递给 onItemClick() 的“位置”值是无用的。“位置”是指数组被过滤后的位置,但我需要知道它的真实位置。所以,我想要做的是当我获得所选项目的文本时(通过使用 getItemAtPosition(position)),我将它与支持 ArrayAdapter 的原始字符串数组一一比较。但是,我发现在调用 onItemClick() 时,适配器已经被过滤了,我无法再访问原始数组。所以我想如果我可以删除过滤器,也许我可以找回原始数组并在其中查找所选项目。
ArrayAdapter<String> mAdapter;
public void onCreate() {
// Create an adapter and remembere it as a class member.
mAdapter = new ArrayAdapter<String>(this, layoutId);
// Add 100 strings to it and attach it to an AutoCompleteTextView
for (int i = 0; i < 100; i++)
mAdapter.add("random text");
((AutoCompleteTextView)findViewById(id)).setAdapter(mAdapter);
}
@Override
public void onItemClick(AdapterView<?> actv, View view, int position, long id) {
if (actv.getAdapter().equals(mAdapter))
Log.d("The adapter contained in actv is the same one I created earlier.");
// And, I can get the text of the item the user selected
String selected = (String)actv.getItemAtPosition(position);
// However, although the adapter passed in is still the same one, but the
// number of items in it is only 1! Because the array has been filtered.
int numItems = actv.getAdapter.getCount();
// So, I'm thinking if I can somehow remove the filtering here, then I can
// get back those 100 items, and do a search like following:
for (int i = 0; i < actv.getAdapter.getCount(); i++)
if (selected == actv.getAdapter.getItem(i))
break; // Eureka!!!
}
Run Code Online (Sandbox Code Playgroud)
要解决获取所选项目的 REAL 位置的问题:
有没有办法利用“id”值?就像,为每个项目分配一个 id,然后希望 onItemClick() 会传回正确的 id。
就像我上面说的那样,删除过滤器(是否可能),取回原始的 100 个项目,然后进行一项一项的搜索。
这是最后的手段,我知道它会起作用,但我不想这样做:一旦我获得所选文本的文本,我就会回到数据源(从数据库中),查询那些100 个项目,并执行搜索。
另一个蹩脚的最后手段:为了避免像#3 那样再次访问数据库的开销,在 onCreate() 中,在创建 ArrayAdapter 时,我使用自己的 ArrayList 来记住所有这 100 个字符串。
我做错了吗?从 AutoCompleteTextView 获取所选项目的真实位置的“正确”方式是什么?
非常感谢!
(我在某处读到过一些似乎来自 Google Android 团队的购买,说应该使用 getFirstVisiblePosition() 来解决位置。但我不知道如何。)
这实际上很容易解决。不要将每个元素添加到适配器中(我假设您的随机文本部分仅用于示例目的),而是使用以下内容:
首先将数组构建到一个变量中,将其命名为 myArray..,然后像这样初始化适配器:
mAdapter = new ArrayAdapter<String>(this, layoutId, myArray);
Run Code Online (Sandbox Code Playgroud)
现在确保 myArray 是一个类变量,以便您可以从类中的其他任何地方引用它。当然,如果您需要从另一个类访问它,您需要为其创建一个 getter...然后您可以轻松地迭代数组以查看所选值是否在数组中。您将在那里拥有整组数据,而不是尝试从适配器获取它。
下面是一个关于使用验证器进行类似用例的好例子: Android, Autocomplettextview, Force text to be from the entry list
| 归档时间: |
|
| 查看次数: |
6512 次 |
| 最近记录: |