`
dengyin2000
  • 浏览: 1225146 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

扩展AutoCompleteTextView让其默认显示一组列表。

 
阅读更多
很多时候, 在做自动下拉框时,默认点上去时需要显示一组默认的下拉数据。但是默认的AutoCompleteTextView是实现不了的, 因为setThreshold方法最小值是1,就算你设的值为0,也会自动改成1的。

    /**
     * <p>Specifies the minimum number of characters the user has to type in the
     * edit box before the drop down list is shown.</p>
     *
     * <p>When <code>threshold</code> is less than or equals 0, a threshold of
     * 1 is applied.</p>
     *
     * @param threshold the number of characters to type before the drop down
     *                  is shown
     *
     * @see #getThreshold()
     *
     * @attr ref android.R.styleable#AutoCompleteTextView_completionThreshold
     */


这时我们可以创建一个类 继承AutoCompleteTextView,覆盖enoughToFilter,让其一直返回true就行。 然后再主动调用showDropDown方法, 就能在不输入任何字符的情况下显示下拉框。

package com.wole.android.pad.view;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;

/**
 * Created with IntelliJ IDEA.
 * User: denny
 * Date: 12-12-4
 * Time: 下午2:16
 * To change this template use File | Settings | File Templates.
 */
public class InstantAutoComplete extends AutoCompleteTextView {
    private int myThreshold;

    public InstantAutoComplete(Context context) {
        super(context);
    }

    public InstantAutoComplete(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public InstantAutoComplete(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean enoughToFilter() {
        return true;
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction,
                                  Rect previouslyFocusedRect) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
        if (focused) {
            performFiltering(getText(), 0);
            showDropDown();
        }
    }

    public void setThreshold(int threshold) {
        if (threshold < 0) {
            threshold = 0;
        }
        myThreshold = threshold;
    }

    public int getThreshold() {
        return myThreshold;
    }
}



     searchSuggestionAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, new ArrayList<String>(5));
        search_et.setAdapter(searchSuggestionAdapter);
        search_et.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

 //如果没有输入任何东西 则显示默认列表,否则调用接口,展示下拉列表
            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() >= 1) {
                    if (fetchSearchSuggestionKeywordsAsyncTask != null) {
                        fetchSearchSuggestionKeywordsAsyncTask.cancel(true);
                    }
                    fetchSearchSuggestionKeywordsAsyncTask =new FetchSearchSuggestionKeywordsAsyncTask();
                    fetchSearchSuggestionKeywordsAsyncTask.execute();
                }else{
                    showHotSearchKeywords();
                }

            }
        });

        search_et.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String item = searchSuggestionAdapter.getItem(position);
                search_et.setText(item);
                search_btn.performClick();
            }
        });

         //点击autocompletetextview时,如果没有输入任何东西 则显示默认列表
        search_et.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (TextUtils.isEmpty(search_et.getText().toString())) {
                    showHotSearchKeywords();
                }
                return false;
            }

        });


 
//这里发现很奇怪的事情, 需要每次new一个ArrayAdapter,要不然有时调用showDropDown不会有效果
private void showHotSearchKeywords() {
        MiscUtil.prepareHotSearchKeywords(getWoleApplication());
        searchSuggestionAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, getWoleApplication().hotSearchHistoryKeywords);
        search_et.setAdapter(searchSuggestionAdapter);
        searchSuggestionAdapter.notifyDataSetChanged();
        search_et.showDropDown();
    }

    private class FetchSearchSuggestionKeywordsAsyncTask extends AsyncTask<Void, Void, List<String>> {

        @Override
        protected List<String> doInBackground(Void... params) {
            List<String> rt = new ArrayList<String>(5);
            String keyword = search_et.getText().toString();
            if (!TextUtils.isEmpty(keyword)) {
                try {
                    String result = NetworkUtil.doGet(BaseActivity.this, String.format(Global.API_SEARCH_SUGGESTIOIN_KEYWORDS, URLEncoder.encode(keyword, "utf-8")), false);
                    Log.i("FetchSearchSuggestionKeywordsAsyncTask", result);
                    if (!TextUtils.isEmpty(result)) {
                        JSONArray array = new JSONArray(result);
                        for (int i = 0; i < array.length(); i++) {
                            JSONObject jsonObject = array.getJSONObject(i);
                            rt.add(jsonObject.optString("keyword"));
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return rt;
        }

        @Override
        protected void onPostExecute(List<String> strings) {
            super.onPostExecute(strings);
            if (!strings.isEmpty()) {
//这里发现很奇怪的事情, 需要每次new一个ArrayAdapter,要不然有时调用showDropDown不会有效果
                searchSuggestionAdapter = new ArrayAdapter<String>(BaseActivity.this, android.R.layout.simple_dropdown_item_1line, strings);
                search_et.setAdapter(searchSuggestionAdapter);
                searchSuggestionAdapter.notifyDataSetChanged();
            }
        }
    }


ref:http://stackoverflow.com/questions/2126717/android-autocompletetextview-show-suggestions-when-no-text-entered
分享到:
评论
4 楼 michaelye1988 2014-07-13  
thanks!终于找到答案了,困扰了很久,原来是要new 一个适配器,notifyDataSetChange没有效果,这坑爹货。
3 楼 gaobq 2013-10-15  
tn0521 写道
似乎没有那么麻烦,给AutoCompleteTextView的对象加上一个setOnTouchListener,showDropDown()即可,代码如下
completeTextView.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event){
completeTextView.showDropDown();//显示下拉列表
           return false;
}
});

showDropDown()方法的执行并不总是有效的,我这边同样的代码:defy android2.3上可以显示;
note2 的android4.1 系统就不能够显示下拉框;
2 楼 tn0521 2013-07-29  
似乎没有那么麻烦,给AutoCompleteTextView的对象加上一个setOnTouchListener,showDropDown()即可,代码如下
completeTextView.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event){
completeTextView.showDropDown();//显示下拉列表
           return false;
}
});
1 楼 tn0521 2013-07-29  
似乎没有那么麻烦,给AutoCompleteTextView的对象加上一个setOnTouchListener,showDropDown()即可,代码如下
completeTextView.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event){
completeTextView.showDropDown();//显示下拉列表
           return false;
}
});

相关推荐

    AutoCompleteTextView 显示更多

    默认情况下,AutoCompleteTextView的下拉列表高度是由系统决定的,通常基于屏幕尺寸和字体大小来计算每一项的高度,从而控制整个列表的显示数量。然而,这种机制在小屏幕设备上可能会导致一个问题:下拉列表中显示的...

    自定义AutoCompleteTextView下拉列表控件

    1. **逐字提示**:在默认的`AutoCompleteTextView`中,当用户输入字符时,通常会显示与输入字符串完全匹配或部分匹配的建议列表。但逐字提示意味着,即使用户只输入了一个字符,也能根据这个字符显示出相关的建议,...

    AutoCompleteTextView从服务器上获得数据显示下拉列表

    AutoCompleteTextView是Android系统提供的一种可以自动补全的文本输入控件,它允许用户在输入时根据已有的数据集匹配并显示建议的选项。这个功能通常用于搜索框、地址输入等场景,提升用户体验。在本主题中,我们将...

    android中AutoCompleteTextView使用

    `AutoCompleteTextView` 是一个带下拉列表的文本输入框,当用户输入一部分内容后,会显示与之匹配的建议列表。其主要属性包括: 1. **android:completionThreshold**:定义触发下拉列表显示所需的最少字符数,默认...

    AutoCompleteTextView

    在Android应用设计中,AutoCompleteTextView常用于提升用户体验,比如在搜索框中,当用户开始输入时,它会显示一个下拉列表,里面包含与已输入内容匹配的建议项。这种功能可以显著减少用户的输入时间,并减少输入...

    AutoCompleteTextViewDemo

    5. **显示建议列表**:一旦过滤结果准备好,AutoCompleteTextView会显示一个下拉列表,展示匹配的建议。用户可以从列表中选择一条历史记录,或者继续输入创建新的条目。 6. **交互反馈**:为了提供良好的用户体验,...

    Android中AutoCompleteTextView的使用步骤.pdf

    这里,`this`是当前Activity的上下文,`android.R.layout.simple_dropdown_item_1line`是列表项的默认布局,`COUNTRIES`是待显示的数据源。 b. **设置适配器** 创建好适配器后,将其绑定到AutoCompleteTextView...

    Android自定义AutoCompleteTextView

    默认情况下,AutoCompleteTextView会显示一个下拉列表,该列表由ArrayAdapter填充,ArrayAdapter可以使用静态数组或动态获取的数据源。例如,使用ArrayList填充ArrayAdapter的代码如下: ```java ArrayList&lt;String&gt;...

    AutoCompleteTextView自动提示问题

    AutoCompleteTextView是Android SDK提供的一种UI组件,用于在用户输入时提供下拉列表的自动提示功能,极大地提升了用户的输入体验。这个控件通常用于搜索框、地址输入等场景,可以根据用户输入的部分字符快速匹配出...

    AutoCompleteTextView汉字和拼音关联

    在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时自动显示匹配的建议列表,从而提升用户体验。本知识点主要关注如何实现`AutoCompleteTextView`与汉字和拼音的关联,使得用户可以...

    AutoCompleteTextView的简单使用

    AutoCompleteTextView是Android SDK提供的一种可以自动补全的文本输入框控件,它结合了EditText和ListView的功能,允许用户在输入时显示出与已输入内容匹配的建议列表。这个功能常见于许多应用程序,如搜索引擎、...

    AutoCompleteTextView自动完成文字输入

    AutoCompleteTextView是Android SDK提供的一种用于输入文本时自动补全的视图组件,它扩展了EditText,能够根据用户输入的部分文字动态显示出匹配的建议列表。这个功能在许多应用中非常常见,例如搜索引擎、地址...

    Android仿百度谷歌自动提示——AutoCompleteTextView

    当用户在输入框中输入字符时,`AutoCompleteTextView`可以展示一个下拉列表,显示与已输入内容匹配的建议项。这种功能通常与数据源(如数组、列表或网络数据)结合使用,以提供动态的建议。 首先,我们需要在布局...

    AutoCompleteTextView和自定义的CursorAdapter

    `AutoCompleteTextView`是`EditText`的一个子类,它可以动态地根据用户输入的内容展示下拉列表,列表中的项来自于数据源。默认情况下,`AutoCompleteTextView`可以与`ArrayAdapter`配合使用,但当我们需要处理的数据...

    android使用AutoCompleteTextView自定义适配器样式

    在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时自动显示匹配的建议列表。通常,我们使用`ArrayAdapter`来连接数据源和`AutoCompleteTextView`,但有时默认的功能可能无法满足...

    AutoCompleteTextView中文和拼音关联自动提示

    在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时自动显示匹配的建议列表,从而提升用户体验。本教程将详细讲解如何利用`AutoCompleteTextView` 实现中文和拼音关联的自动提示...

    autocompleteTextview控件

    默认值为2,设置为1意味着用户输入一个字符就会显示建议列表。 ### 2. 数据源与适配器 `AutoCompleteTextView`需要一个数据源来提供下拉建议。通常,我们使用`ArrayAdapter`或自定义的`Adapter`来绑定数据。以下是...

Global site tag (gtag.js) - Google Analytics