AutoCompleteTextView自定义item布局

来源:互联网 发布:游戏数据修改器 编辑:程序博客网 时间:2024/05/17 22:09

一、给AutoCompleteTextView设置适配器,一般使用系统默认的适配器ArrayAdapter等

这样item的布局如下:

<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/item_txt_tip"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginBottom="20dip"    android:layout_marginTop="20dip"    android:paddingTop="20dp"    android:textColor="#000000"    android:textSize="18sp"    tools:targetApi="ice_cream_sandwich"></TextView>
二、但是我们想在item的布局中加入其他东西怎么办?这样我们只能自己定义适配器,首先先看看AutoCompleteTextView需要的适配器的类型,

查看AutoCompleteTextView的setAdapter()方法的源码如下:

public <T extends ListAdapter & Filterable> void setAdapter(T adapter) {    if (mObserver == null) {        mObserver = new PopupDataSetObserver(this);    } else if (mAdapter != null) {        mAdapter.unregisterDataSetObserver(mObserver);    }    mAdapter = adapter;    if (mAdapter != null) {        //noinspection unchecked        mFilter = ((Filterable) mAdapter).getFilter();        adapter.registerDataSetObserver(mObserver);    } else {        mFilter = null;    }    mPopup.setAdapter(mAdapter);}
从这里我们看出自定义的适配器可以继承BaseAdapter,但必须要实现Filterable接口,直接上源码。

三、适配器核心代码:

public class PoiKeyTipListAdapter extends BaseAdapter implements Filterable {    private ArrayList<String> stringArrayList ;    private Context context;    private OnDataChangedListener changedListener;    public PoiKeyTipListAdapter(ArrayList<String> stringArrayList, Context context) {        this.stringArrayList = stringArrayList;        this.context = context;    }    @Override    public int getCount() {        return stringArrayList == null ? 0 : stringArrayList.size();    }    @Override    public Object getItem(int position) {        return stringArrayList == null ? null : stringArrayList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        ViewHolder viewHolder;        if (convertView == null){            convertView = LayoutInflater.from(context).inflate(R.layout.item_input_tip_layout,parent,false);            viewHolder = new ViewHolder();            viewHolder.item_txt_tip = (TextView) convertView.findViewById(R.id.item_txt_tip);            convertView.setTag(viewHolder);        }else {            viewHolder = (ViewHolder) convertView.getTag();        }         viewHolder.item_txt_tip.setText(stringArrayList.get(position));        convertView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (changedListener != null) {                    changedListener.dataChangedListener(stringArrayList.get(position));                }            }        });        return convertView;    }    static class  ViewHolder{        private  TextView item_txt_tip ;    }    @Override    public Filter getFilter() {        return stringArrayList == null || stringArrayList.size() <= 0 ? null : new MyFilter();    }    /**     * 数据改变监听接口     * <h3>Version</h3> 1.0     * <h3>CreateTime</h3> 2016/3/30,9:57     * <h3>UpdateTime</h3> 2016/3/30,9:57     * <h3>CreateAuthor</h3> luzhenbang     * <h3>UpdateAuthor</h3>     * <h3>UpdateInfo</h3> (此处输入修改内容,若无修改可不写.)     *     */    public interface OnDataChangedListener{        void dataChangedListener(String keyWord);    }    /**     * 设置数据改变监听     * <h3>Version</h3> 1.0     * <h3>CreateTime</h3> 2016/3/30,10:07     * <h3>UpdateTime</h3> 2016/3/30,10:07     * <h3>CreateAuthor</h3> luzhenbang     * <h3>UpdateAuthor</h3>     * <h3>UpdateInfo</h3> (此处输入修改内容,若无修改可不写.)     *     * @param changedListener OnDataChangedListener对象     */    public void setOnDataChangedListener(OnDataChangedListener changedListener){        this.changedListener = changedListener;    }    class  MyFilter extends  Filter{        @Override        protected FilterResults performFiltering(CharSequence constraint) {            return new MyFilterResults();        }        @Override        protected void publishResults(CharSequence constraint, FilterResults results) {        }        class  MyFilterResults extends Filter.FilterResults{            public MyFilterResults() {                values = stringArrayList;                count = stringArrayList.size();            }        }    }}
四、Activity中的核心代码:

public class MainActivity extends AppCompatActivity {    private AutoCompleteTextView auto_txt_key_word;    /** 数据列表*/    private ArrayList<String> strings;    /** 适配器*/    private PoiKeyTipListAdapter poiKeyTipListAdapter;    /** 记录选中的关键字*/    private String keyWordString;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViews();        initData();        setWidgetListener();    }    /**     * 初始化Views     */    private void initViews() {        auto_txt_key_word = (AutoCompleteTextView) findViewById(R.id.auto_txt_key_word);    }    /**     * 初始化数据     */    private void initData() {        strings = new ArrayList<>();        for (int i = 0; i < 10; i++) {            strings.add("内容" + i);        }        //使用系统提供的适配器       /* ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item_input_hint_layout, strings);        auto_txt_key_word.setAdapter(aAdapter);*/        //自定义适配器        poiKeyTipListAdapter = new PoiKeyTipListAdapter(strings,this);        auto_txt_key_word.setAdapter(poiKeyTipListAdapter);        //设置监听    }    /**     * 设置监听     */    private void setWidgetListener() {        poiKeyTipListAdapter.setOnDataChangedListener(new PoiKeyTipListAdapter.OnDataChangedListener() {            @Override            public void dataChangedListener(String keyWord) {                //记录选中的关键字                keyWordString = keyWord;                auto_txt_key_word.setText(keyWord);                strings.clear();                poiKeyTipListAdapter.notifyDataSetChanged();            }        });        auto_txt_key_word.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) {                //选中弹框列表的某一项、strings大小为0时,才能重新赋值                if (strings.size() <= 0 && !TextUtils.isEmpty(s) && !TextUtils.isEmpty(keyWordString)                        && !TextUtils.equals(s, keyWordString)  ){                    //重新赋值                    for (int i = 0; i < 10; i++) {                        strings.add("内容" + i);                    }                    poiKeyTipListAdapter.notifyDataSetChanged();                }            }            @Override            public void afterTextChanged(Editable s) {                if (!TextUtils.isEmpty(s)){                    auto_txt_key_word.setSelection(s.length());                }            }        });    }}
五、效果图


源码:http://download.csdn.net/detail/lu1024188315/9477778




















0 0