bla*_*rna 5 android filter autocompletetextview
这几天我一直在拉我的头发,我正试图在android中设置一个autocompletetextview,用户输入一个键,自动完成建议是值,但是我现在尝试了大约10种不同的方式,扩展BaseAdapter,SimpleAdapter和现在的ArrayAdapter,我已经通过调试器注意到我的结果集很好,但我真的不知道我应该在代码的publishResults()部分做什么.第一个参数是使用以下XML的自定义autocompletetextview控件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/txtInnerView2" android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这个类看起来像这样:
public class NewArrayAdapter<T> extends ArrayAdapter implements Filterable {
ArrayList<String> allWords;
ArrayList<String> resultWords;
String value[] = { "Awesome", "Bear", "Cat", "Dog" };
String key[] = { "A", "B", "C", "D" };
public NewArrayAdapter(Context context, int resource, int textViewResourceId) {
super(context, resource, textViewResourceId);
// TODO Auto-generated constructor stub
allWords = new ArrayList<String>();
resultWords = new ArrayList<String>();
}
@Override
public Filter getFilter() {
Filter custom_filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults f = new FilterResults();
if (constraint != null) {
ArrayList<String> lstResults = new ArrayList<String>();
for (int x = 0; x < key.length; x++) {
if (key[x].startsWith(constraint.toString().toUpperCase())) {
lstResults.add(value[x]);
}
}
f.values = lstResults;
f.count = lstResults.size();
}
return f;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
resultWords.clear();
if (results.count > 0) {
resultWords.addAll((Collection<? extends String>) results.values);
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
return custom_filter;
}
}
Run Code Online (Sandbox Code Playgroud)
int构造函数,public NewArrayAdapter(Context context,int resource,int textViewResourceId,List objects)第二个参数是autocompletetextview,第三个是嵌套的TextView,第四个是List的引用,我只能假设是最终的应该是结果集,但显然不是......这让我疯了,有人有什么建议吗?我的主要问题是结果必须基于关键,而不是价值,例如,键入"a"可能意味着"tiddlywinks"的结果,因为我在这里尝试做的任何信息都会很棒,非常感谢
首先设置文本观察器来编辑文本。像 urEditText.addTextChangedListener(searchInputTextWatcher);
private TextWatcher searchInputTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence sequence, int start, int before,
int count) {
//Log.i("View adapter count",String.valueOf(locationViewAdapter.getCount()));
//if (locationViewAdapter.getCount()>1)
someAdapter.filterList(sequence);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
};
Run Code Online (Sandbox Code Playgroud)
其中 someAdapter 是您的适配器,您在其中实现方法 filterList(搜索字段中的单词类型)
public void filterArrayList(CharSequence sequence) {
if (TextUtils.isEmpty(sequence)) {
someArrayList = (ArrayList<type>) cloneCategoryArrayList
.clone();
} else {
someArrayList = (ArrayList<type>) cloneCategoryArrayList
.clone();
if (!TextUtils.isEmpty(sequence)) {
List<type> tempCategoryArrayList = new ArrayList<type>(
someArrayList);
for (type obj : tempCategoryArrayList) {
String typeName = obj.name;
if (!typename.toLowerCase().startsWith(
sequence.toString().toLowerCase(), 0))
somearrayList.remove(type);
}
}
}
notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2564 次 |
| 最近记录: |