BaseAdapter列表视图筛选的Android [英] BaseAdapter Listview Filtering Android
问题描述
在我的列表视图
,我有文字和图片,他们都存储在的ArrayList
。
In my Listview
, I am having text and image and they are stored in ArrayList
.
我使用 BaseAdapter
显示列表。
我想用过滤器
基于文本的的EditText
键入的列表中,但不能正常工作。
I want to use filter
on the list based on text typed in EditText
, but is not working.
我的code是:副词是的EditText
My code is : adv is EditText
adv.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
viewadapter.getFilter().filter(s);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
和我的 BaseAdapter
工具可筛选
让用getFilter
方法在是:
And my BaseAdapter
implements Filterable
so getFilter
method in that is:
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
if (mFilter == null) {
mFilter = new ArrayFilter();
}
return mFilter;
}
和我的 ArrayFilter
是:
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (mNames == null) {
synchronized (mLock) {
mNames = new ArrayList<String>(mObjects);
}
}
if (prefix == null || prefix.length() == 0) {
synchronized (mLock) {
ArrayList<String> list = new ArrayList<String>(mNames);
results.values = list;
results.count = list.size();
}
} else {
String prefixString = prefix.toString().toLowerCase();
final ArrayList<String> values = mNames;
final int count = values.size();
final ArrayList<String> newValues = new ArrayList<String>(count);
for (int i = 0; i < count; i++) {
final String value = values.get(i);
final String valueText = value.toString().toLowerCase();
// First match against the whole, non-splitted value
if (valueText.startsWith(prefixString)) {
newValues.add(value);
} else {
final String[] words = valueText.split(" ");
final int wordCount = words.length;
for (int k = 0; k < wordCount; k++) {
if (words[k].startsWith(prefixString)) {
newValues.add(value);
break;
}
}
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
//noinspection unchecked
mObjects = (List<String>) results.values;
if (results.count > 0) {
viewadapter.notifyDataSetChanged();
} else {
viewadapter.notifyDataSetInvalidated();
}
}
}
在 mNames
是的ArrayList
与我想要过滤的的ListView
。
in that mNames
is the ArrayList
with which I want to filter the ListView
.
和同时启用 setTextFilterEnabled(真)。
,但滤波是行不通的。
and also enabled setTextFilterEnabled(true).
, but filtering is not working.
这是正确的做法?有什么不对的呢?如果没有,那怎么办?
Is this correct approach? what's wrong in it? if not, how to do that?
推荐答案
这个API演示示例
public class SearchViewFilterMode extends Activity implements SearchView.OnQueryTextListener {
private static final String TAG = "SearchViewFilterMode";
private SearchView mSearchView;
private ListView mListView;
private ArrayAdapter<String> mAdapter;
private final String[] mStrings = Cheeses.sCheeseStrings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.searchview_filter);
mSearchView = (SearchView) findViewById(R.id.search_view);
mListView = (ListView) findViewById(R.id.list_view);
mListView.setAdapter(mAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
mStrings));
mListView.setTextFilterEnabled(true);
setupSearchView();
}
private void setupSearchView() {
mSearchView.setIconifiedByDefault(false);
mSearchView.setOnQueryTextListener(this);
mSearchView.setSubmitButtonEnabled(false);
mSearchView.setQueryHint(getString(R.string.cheese_hunt_hint));
}
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
mListView.clearTextFilter();
} else {
mListView.setFilterText(newText.toString());
}
return true;
}
public boolean onQueryTextSubmit(String query) {
return false;
}
}
这篇关于BaseAdapter列表视图筛选的Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!