欢迎访问宙启技术站
智能推送

AutoComlete TextView

发布时间:2023-05-17 16:44:07

AutoCompleteTextView 是 Android 平台中的一个控件,它是在EditText的基础上添加了一个列表,当用户在EditText里面输入文本的时候,就会根据用户的输入内容在列表中找出匹配项,并将其显示在EditText下面。用户可以选择列表中的某一项,该项的文本就会被自动填充到EditText中。这个控件有在开发中非常多的运用,在我们日常开发中,难免会用到,本篇文章主要介绍AutoCompleteTextView的基本用法以及如何对其进行定制化设置。

1.基本用法

AutoCompleteTextView最简单的使用方式是直接在Xml文件中定义它,在布局文件中添加下面代码:

<AutoCompleteTextView
    android:id="@+id/autoCompleteTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

运行程序,效果如下:

![image-20210827113859856](https://gitee.com/XiaoShenKeHeBen/typora_img/raw/master/img/image-20210827113859856.png)

还不太好看,没有列表的内容。这是因为 AutoCompleteTextView 需要通过适配器来提供列表中的内容。

2.适配器

AutoCompleteTextView的适配器可以使用 ArrayAdapter或者 BaseAdapter,这里我们使用ArrayList作为数据源,通过自定义一个新的适配器来实现CustomAdapter类:

public class CustomAdapter extends ArrayAdapter<String> {

    private ArrayList<String> mData;

    public CustomAdapter(Context context, ArrayList<String> data) {
        super(context,0, data);
        mData = data;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        TextView textView = new TextView(getContext());
        textView.setText(mData.get(position));
        textView.setTextSize(18);
        return textView;
    }
}

上面代码定义了一个CustomAdapter类,继承了ArrayAdapter,把数据源设置成一个ArrayList。在getView方法中,将TextView作为View组件返回,并设置要显示的文本和字体大小。可以根据自己的需要设置TextView的其他属性。

3.设置数据源

在代码中我们先创建一个ArrayList,设置它的初始内容,当Text改变的时候,我们会根据改变的内容动态更新mData的内容。这里我们使用SimpleOnTextChangedListener实现。

public class MainActivity extends AppCompatActivity {

    AutoCompleteTextView mAuto;

    ArrayList<String> mData= new ArrayList<String>() {{
        add("Apple");
        add("Banana");
        add("Cherry");
        add("Durian");
        add("Eggplant");
        add("Fig");
        add("Grape");
    }};

    CustomAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAuto = findViewById(R.id.autoCompleteTextView); //绑定控件

        //新建一个自定义的适配器
        mAdapter = new CustomAdapter(this, mData);

        //设置Adapter
        mAuto.setAdapter(mAdapter);

        mAuto.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) {
                ArrayList<String> filterData = new ArrayList<>();

                //根据文本改变动态更新列表
                for (String item : mData){
                    if (item.toLowerCase().startsWith(s.toString().toLowerCase())){
                        filterData.add(item);
                    }
                }
                mAdapter.clear();
                mAdapter.addAll(filterData);
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

    }
}

我们可以参考上面的代码自定义实现数据源的更新,Adapter的更新等功能。例如可以把TextView替换为其他的控件,或者根据数据源的不同情况做出不同的视觉效果。

4.定制化设置

AutoCompleteTextView 除了上面介绍的基本用法之外,还有很多自定义的设置,下面介绍一些常用的设置。

1)我们可以通过 setThreshold 方法设置输入多少个字符开始匹配自动填充的文本项。例如:

mAuto.setThreshold(1); // 设置输入一个字符之后开始显示匹配的列表项

2)可以通过 setDropDownWidthsetDropDownHeight 方法设置下拉列表的宽度和高度。例如:

mAuto.setDropDownWidth(550); // 设置下拉列表的宽度
mAuto.setDropDownHeight(385); // 设置下拉列表的高度

3)可以通过 setDropDownVerticalOffset 方法设置下拉列表与 AutoCompleteTextView 的上边缘之间的垂直偏移量。例如:

mAuto.setDropDownVerticalOffset(dip2px(-12)); // 设置下拉列表和AutoCompleteTextView之间的垂直偏移量

4)可以通过 setDropDownBackgroundDrawable 方法或 setDropDownBackgroundResource 方法设置下来列表的背景颜色,可以通过 setDropDownHorizontalOffset 方法设置下拉列表与控件的左边缘之间的水平偏移量。例如:

mAuto.setDropDownBackgroundResource(R.drawable.autocomplete_dropdown_bg); // 设置下拉列表的背景颜色
mAuto.setDropDownHorizontalOffset(dip2px(10)); // 设置下拉列表和AutoCompleteTextView之间的水平偏移量

5)可以通过 setCompletionHint 方法设置下拉列表的提示文本。例如:

mAuto.setCompletionHint("请输入你想搜索的关键字"); //设置提示文本

6)可以通过 setDropDownAnchor 方法或 setDropDownAnchor 属性设置下拉列表的锚点,用于调整列表的位置和位置。例如:

mAuto.setDropDownAnchor(R.id.search_layout); // 设置下拉列表的锚点

7)可以通过重写 protected CharSequence convertSelectionToString(Object selectedItem) 方法来自定义返回的文本,以便在用户选择列表项时更改 AutoCompleteTextView 中的文本。例如:

protected CharSequence convertSelectionToString(Object selectedItem) {
    String str = (String) selectedItem;
    return str;
}

8)可以通过重写 public Filter getFilter() 方法来自定义匹配规则,以更好地匹配和搜索文本。例如:

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            //自定义匹配规则
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            //匹配结果
        }
    };
}

9)可以通过重写 public boolean enoughToFilter() 方法来更改触发自动填充的条件。例如:

@Override
public boolean enoughToFilter() {
    return getText().length() > 1; // 输入两个字符后开始匹配
}

总之,AutoCompleteTextView 提供了非常丰富和灵活的 API,可以根据具体的需求进行定制化设置,以满足不同的业务需求。通过上述介绍,我们希望能够让大家更加深入地了解 AutoCompleteTextView,从而在实际开发中更好地应用它。