在 Android 中为 Spinner 创建文本过滤器(如快速搜索)
Posted
技术标签:
【中文标题】在 Android 中为 Spinner 创建文本过滤器(如快速搜索)【英文标题】:Creating a text filter (like quick search) for a Spinner in Android 【发布时间】:2011-08-13 16:32:19 【问题描述】:我正在开发一个 android 应用程序。我在这里有一些小部件,包括 Spinner。我希望使用快速搜索按钮可以搜索 Spinner 对象。这个想法是用户点击 Spinner 对象并看到列表(适配器)。如果他点击快速搜索按钮,则应该为他提供一个文本字段以输入一个字母,然后微调器列表会跳转到它找到的第一个带有所提供字母的单词。就像它适用于 html 和 select 标签一样。
我试过谷歌(当然也是如此),但似乎
没有人对这样的解决方案感兴趣或 这是一个严密保护的秘密。 :)你对这个话题有什么建议吗?
【问题讨论】:
嗯,我有某种解决方案,但我现在在其他地方工作,我看不到存储库。 【参考方案1】:看起来你在谈论AutoCompleteTextView中给出的类似功能
【讨论】:
嗯,应用程序使用了一个特殊的 Spinner 对象(从 Spinner 扩展),它具有键值对。此外,它必须是下拉列表而不是编辑文本字段。我不认为它会以这种方式工作。 @AdamArold 那么这怎么可能是公认的答案呢?即使没有引入输入值,微调器也允许选择。 如您所见,这个问题已有 3 年历史。我有 1 年没有使用 Android,所以它不再相关了。【参考方案2】:我知道这个问题很老了,但今天我也需要这个功能,因为我找不到任何东西,所以我为这些微调器做了一个适配器
适配器:
public class Searchspinner extends ArrayAdapter<String>
private LayoutInflater inflater;
private boolean dropdown = false;
private OnClickListener onsearch;
private ActionBar ab;
private final ArrayList<String> result = new ArrayList<String>();
private InputMethodManager keyboard;
private boolean searching = false;
public Searchspinner(Context context, int resource,
ArrayList<String> objects, LayoutInflater l, ActionBar a,
InputMethodManager imm, String spinnerid)
super(context, resource, objects);
inflater = l;
ab = a;
keyboard = imm;
createSearch();
// TODO Auto-generated constructor stub
@Override
public View getDropDownView(int position, View cnvtView, ViewGroup prnt
dropdown = true;
return getCustomView(position, cnvtView, prnt);
@Override
public View getView(int pos, View cnvtView, ViewGroup prnt)
dropdown = false;
return getCustomView(pos, cnvtView, prnt);
public View getCustomView(int position, View convertView, ViewGroup parent)
if (!dropdown)
View mySpinner = inflater.inflate(
R.layout.spinner_ressource_search, parent, false);
TextView main_text = (TextView) mySpinner
.findViewById(R.id.tv_spinner_first);
main_text.setText(getItem(position));
ImageButton search = (ImageButton) mySpinner
.findViewById(R.id.searchbutton);
if (!searching)
search.setImageResource(R.drawable.search);
else
search.setImageResource(R.drawable.search_check);
search.setOnClickListener(onsearch);
return mySpinner;
View mySpinner = inflater.inflate(R.layout.auftragtextview, parent,
false);
TextView sub_text = (TextView) mySpinner.findViewById(R.id.TextView01);
sub_text.setText(getItem(position));
return mySpinner;
private void createSearch()
onsearch = new OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
if (searching)
searching = false;
ab.setCustomView(R.layout.actionbar_layout);
ab.getCustomView().setTag("0");
keyboard.toggleSoftInput(0,
InputMethodManager.HIDE_IMPLICIT_ONLY);
for (int i = 0; i < result.size(); i++)
add(result.get(i));
result.remove(i);
i--;
((ImageButton) v).setImageResource(R.drawable.search);
return;
((ImageButton) v).setImageResouce(R.drawable.search_check);
searching = true;
ab.setCustomView(R.layout.searchable);
final EditText et = (EditText) ab.getCustomView()
.findViewById(R.id.editText1);
et.setActivated(true);
keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
0);
et.requestFocus();
et.addTextChangedListener(new TextWatcher()
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count)
for (int i = 0; i < getCount(); i++)
if (!getItem(i).contains(s))
result.add(getItem(i));
remove(getItem(i));
i--;
for (int i = 0; i < result.size(); i++)
if (result.get(i).toLowerCase()
.contains(s.toString().toLowerCase()))
add(result.get(i));
result.remove(i);
i--;
@Override
public void beforeTextChanged(CharSequence s,
int start, int count, int after)
// TODO Auto-generated method stub
@Override
public void afterTextChanged(Editable s)
// TODO Auto-generated method stub
);
;
spinner_ressource_search.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_ >
<TextView
android:id="@+id/tv_spinner_first"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="TextView" />
<ImageButton
android:id="@+id/searchbutton"
android:layout_
android:layout_
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@android:color/transparent"
android:src="@drawable/search" />
</RelativeLayout>
还有auftragtextview.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TextView01"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@+d/TextView01"
android:textSize="16sp" >
</TextView>
这就是您创建适配器的方式:
Searchspinner auftragSpinnerAdapter = new Searchspinner(
this.getApplicationContext(),
R.layout.auftragtextview,
list_auftragSpinner,getLayoutInflater(),
getActionBar(),
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)
);
我希望这对任何人都有帮助,并且我没有错过已经建立的方法:D 问候
编辑:
searcheble.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical"
android:background="@drawable/actionbar_background_beosys" >
<EditText
android:id="@+id/editText1"
android:hint="@string/suche"
android:layout_
android:layout_
android:layout_marginLeft="15dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:layout_marginRight="15dp"
android:singleLine="true"
/>
所以 EditText1 只是视图中的一个简单的 editText,当您搜索时它会出现在操作栏中。
ActionbarLayout 是普通的 ActionbarView。
【讨论】:
searchable
、actionbar_layout
和 editText1
项目是什么??
actionbar_layout 仍未在答案中定义【参考方案3】:
你可以自己实现。
使用按钮而不是微调器,设计一个对话框,其中EditText
用于查询输入,ListView
用于您要显示的内容。
然后根据EditText
中输入的用户,过滤ListView
的内容。
filter(list, text);
adapter.notifyDataSetChanged();
【讨论】:
这是一个非常好的解决方案!不需要第三个图书馆以上是关于在 Android 中为 Spinner 创建文本过滤器(如快速搜索)的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 中为 Spinner 的数组适配器添加枚举
在 Android 中使用 Spinner Dependable 创建动态视图
如何制作带有初始文本“Select One”的Android Spinner?