AutoCompleteTextView 自定义提示样式

项目中用到AutoCompleteTextView  自动提示功能,如果用自带的ArrayAdapter就一种样式,非常丑,而且每一项提示文字过多的话不会自动换行。

所以自己自定义了一个适配器。

 

效果图:

 

 

1、每一项的布局文件:(可以自己定义)

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="wrap_content"
 5     android:orientation="vertical">
 6 
 7     <TextView xmlns:android="http://schemas.android.com/apk/res/android"
 8         android:id="@+id/text1"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:gravity="center_vertical"
12         android:layout_marginLeft="@dimen/dimen_10"
13         android:layout_marginRight="@dimen/dimen_10"
14         android:layout_marginTop="@dimen/dimen_5"
15         android:layout_marginBottom="@dimen/dimen_5"
16         android:textSize="@dimen/textsize_14"
17         android:lineSpacingExtra="@dimen/dimen_4"
18         android:singleLine="false" />
19 
20     <View
21         android:layout_width="match_parent"
22         android:layout_height="@dimen/dimen_2"
23         android:background="@color/line_bg"
24         android:layout_marginLeft="@dimen/dimen_10"
25         android:layout_marginRight="@dimen/dimen_5"/>
26 
27 </LinearLayout>

 

这里用android:lineSpacingExtra="@dimen/dimen_4"属性指定了一下行间距。

 

 

2、适配器代码如下:

  1 package nari.app.BianDianYingYong.adapter;
  2 
  3 import android.content.Context;
  4 import android.view.View;
  5 import android.view.ViewGroup;
  6 import android.widget.BaseAdapter;
  7 import android.widget.Filter;
  8 import android.widget.Filterable;
  9 import android.widget.TextView;
 10 
 11 import java.util.ArrayList;
 12 import java.util.List;
 13 
 14 import nari.app.BianDianYingYong.R;
 15 
 16 /**
 17  * Created by weihao on 2018/5/28.
 18  * 继承BaseAdapter,实现Filterable
 19  */
 20 
 21 public class AutoEditTextAdapter extends BaseAdapter implements Filterable {
 22     private ArrayFilter mFilter;
 23     private List<String> mList;
 24     private Context context;
 25     private ArrayList<String> mUnfilteredData;
 26 
 27     public AutoEditTextAdapter(List<String> mList, Context context) {
 28         this.mList = mList;
 29         this.context = context;
 30     }
 31 
 32     @Override
 33     public int getCount() {
 34 
 35         return mList==null ? 0:mList.size();
 36     }
 37 
 38     @Override
 39     public Object getItem(int position) {
 40         return mList.get(position);
 41     }
 42 
 43     @Override
 44     public long getItemId(int position) {
 45 
 46         return position;
 47     }
 48 
 49     @Override
 50     public View getView(int position, View convertView, ViewGroup parent) {
 51         View view;
 52         ViewHolder holder;
 53         if(convertView==null){
 54             view = View.inflate(context, R.layout.autotext_list_item, null);
 55 
 56             holder = new ViewHolder();
 57             holder.text1 = (TextView) view.findViewById(R.id.text1);
 58 
 59 
 60             view.setTag(holder);
 61         }else{
 62             view = convertView;
 63             holder = (ViewHolder) view.getTag();
 64         }
 65 
 66         String pc = mList.get(position);
 67 
 68         holder.text1.setText("-- "+pc);
 69 
 70 
 71         return view;
 72     }
 73 
 74     static class ViewHolder{
 75         public TextView text1;
 76 
 77     }
 78 
 79     @Override
 80     public Filter getFilter() {
 81         if (mFilter == null) {
 82             mFilter = new ArrayFilter();
 83         }
 84         return mFilter;
 85     }
 86 
 87     private class ArrayFilter extends Filter {
 88 
 89         @Override
 90         protected FilterResults performFiltering(CharSequence prefix) {
 91             FilterResults results = new FilterResults();
 92 
 93             if (mUnfilteredData == null) {
 94                 mUnfilteredData = new ArrayList<String>(mList);
 95             }
 96 
 97             if (prefix == null || prefix.length() == 0) {
 98                 ArrayList<String> list = mUnfilteredData;
 99                 results.values = list;
100                 results.count = list.size();
101             } else {
102                 String prefixString = prefix.toString().toLowerCase();
103 
104                 ArrayList<String> unfilteredValues = mUnfilteredData;
105                 int count = unfilteredValues.size();
106 
107                 ArrayList<String> newValues = new ArrayList<String>(count);
108 
109                 for (int i = 0; i < count; i++) {
110                     String pc = unfilteredValues.get(i);
111                     if (pc != null) {
112 
113                         if(pc!=null && pc.startsWith(prefixString)){
114 
115                             newValues.add(pc);
116                         }else if(pc!=null && pc.startsWith(prefixString)){
117 
118                             newValues.add(pc);
119                         }
120                     }
121                 }
122 
123                 results.values = newValues;
124                 results.count = newValues.size();
125             }
126 
127             return results;
128         }
129 
130         @Override
131         protected void publishResults(CharSequence constraint,
132                                       FilterResults results) {
133 
134             mList = (List<String>) results.values;
135             if (results.count > 0) {
136                 notifyDataSetChanged();
137             } else {
138                 notifyDataSetInvalidated();
139             }
140         }
141 
142     }
143 }

 

3、调用:

 1 //获取控件实例
 2 AutoCompleteTextView et_wtms = (AutoCompleteTextView) layout.findViewById(R.id.et_wtms);
 3 //设置输入一个字就自动提示,默认是两个
 4 et_wtms.setThreshold(1);
 5 
 6 AutoEditTextAdapter adapter = new AutoEditTextAdapter(key, context);
 7 
 8 et_wtms.setAdapter(adapter);
 9 
10 et_wtms.addTextChangedListener(new TextWatcher() {//文字改变事件
11                 @Override
12                 public void beforeTextChanged(CharSequence s, int start, int count, int after) {
13                    
14                 }
15 
16                 @Override
17                 public void onTextChanged(CharSequence s, int start, int before, int count) {
18 
19                 }
20 
21                 @Override
22                 public void afterTextChanged(Editable s) {
23                     
24                 }
25             });
26 
27 //点击就自动提示
28 et_wtms.setOnClickListener(new View.OnClickListener() {
29                 @Override
30                 public void onClick(View v) {
31                     et_wtms.showDropDown();
32                 }
33             });

 

posted @ 2018-05-28 16:17  vetter  阅读(2899)  评论(0编辑  收藏  举报