如何使用edittext和SimpleCursorAdapter过滤ListView?

时间:2013-05-30 21:32:07

标签: android android-listview

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

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

1 个答案:

答案 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;
  }
}

就是这样!!

希望这对任何人都有用。如果您认为有比这更好的解决方案,请分享!!。