不止一个人遇到过如何为使用SimpleCursorAdapter的ListView实现Filter的问题。我有这个问题,我在这个网站上找到了很多关于这方面的答案。我从各处获取了一些代码,直到我最终完成它并且看起来更简单。
我见过Google I / O 2010 - youtube上的ListView视频世界,它说你必须实现getFilter方法并在类适配器上实现Filterable,如下所示:
public class MyListCursorAdapter extends SimpleCursorAdapter implements Filterable{
...
@Override
public Filter getFilter() {
return new Filter(){
@Override
protected FilterResults performFiltering(CharSequence charSequence){
FilterResults results = new FilterResults();
//If there's nothing to filter on, return the original data for your list
if(charSequence == null || charSequence.length() == 0){
results.values = originalData;
results.count = originalData.getCount();
}
else{
Cursor filterResultsData = null;
filterResultsData = DB.getResults(charSequence);
results.values = filterResultsData;
results.count = filterResultsData.getCount();
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults){
filteredData = (Cursor) filterResults.values;
if (filterResults.count > 0) {
notifyDataSetChanged();
}else{
notifyDataSetInvalidated();
}
}
};
}
}
至少是我试图做的事情。我已经看到使用ArrayAdapter而不是Cursor,效果非常好。但是在光标的情况下,它不起作用,至少不适合我。也许我做错了什么。所以我对做什么有点困惑。我知道我有一个编辑文本,一个列表视图,每次在我的编辑文本上放一些文本我希望我的列表被过滤。
现在我要回答我自己的问题,因为我想与你分享我的解决方案。
答案 0 :(得分:1)
这就是我所做的:
<强>布局:强>
<EditText
android:id="@+id/editTextSearch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:hint="@string/search" >
</EditText>
<ListView
android:id="@id/android:list"
android:textFilterEnabled="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
注意ListView中的android:textFilterEnabled =“true”。
我的ListActivity或ListFragment:
public class ClientesActivity extends ListFragment {
private MyListCursorAdapter myAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_clientes, container, false);
//call to a method that fill my list
myListGetFilled(view);
//Put a listener to edit text search
EditText etSearch = (EditText) view.findViewById(R.id.editTextSearch);
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
myAdapter.getFilter().filter(cs);
}
@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
}
});
return view;
}
private void myListGetFilled(View view){
Cursor mCursor = DB.fillMyList(getActivity());
if(mCursor.getCount()>0){
String[] from = new String[] { "name", "description"};
int[] to = new int[] { R.id.textViewName, R.id.textViewDescription};
ListView myListView = (ListView) view.findViewById (android.R.id.list);
myAdapter = new MyListCursorAdapter(context, R.layout.activity_row_list, mCursor, from, to);
myListView .setAdapter(myAdapter);
}
}
最后是我的自定义光标适配器:
public class MyListCursorAdapter extends SimpleCursorAdapter implements Filterable{
...
/*THE METHOD THAT DOES THE MAGIC*/
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
if (getFilterQueryProvider() != null){
return getFilterQueryProvider().runQuery(constraint);
}
Cursor filterResultsData = DB.getResults(constraint);
return filterResultsData;
}
}
就是这样!!
希望这对任何人都有用。如果您认为有比这更好的解决方案,请分享!!。