在 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。

【讨论】:

searchableactionbar_layouteditText1 项目是什么?? actionbar_layout 仍未在答案中定义【参考方案3】:

你可以自己实现。

使用按钮而不是微调器,设计一个对话框,其中EditText 用于查询输入,ListView 用于您要显示的内容。 然后根据EditText中输入的用户,过滤ListView的内容。

filter(list, text);
adapter.notifyDataSetChanged(); 

【讨论】:

这是一个非常好的解决方案!不需要第三个图书馆

以上是关于在 Android 中为 Spinner 创建文本过滤器(如快速搜索)的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中为 Spinner 的数组适配器添加枚举

在 Android 中使用 Spinner Dependable 创建动态视图

如何制作带有初始文本“Select One”的Android Spinner?

Spinner 不显示数组和文本

Android fragment spinner 修改默认显示的文本内容

Android Spinner:删除文本和下拉图标之间的多余空格