2013-05-30 96 views
1

不止一个人遇到了如何为使用SimpleCursorAdapter的ListView实现过滤器的问题。我遇到了这个问题,并且在这个网上找到了很多关于这个问题的答案。我从各处收集了一些代码,直到我终于找到了工作,而且看起来更简单。如何使用编辑文本和SimpleCursor适配器过滤ListView?

我见过的谷歌I/O 2010 - YouTube上的ListView视频的世界,它说,你必须实现用getFilter方法并实现过滤的类适配器上,这样的事情:

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,效果很好。但在光标的情况下,它不起作用,至少不适合我。也许我做错了什么。所以我对于做什么感到困惑。我知道我有一个编辑文本,一个列表视图,每次在我的编辑文本上放一些文本,我希望我的列表得到过滤。

现在我要回答我的问题,因为我想与大家分享我的解决方案。

回答

1

这是我做了什么:

布局:在ListView控件textFilterEnabled = “真”:

<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> 

注重机器人。

我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; 
    } 
} 

就是这样!。

希望这可以是有用的人。如果您认为有比这更好的解决方案,请分享!!