1

不止一个人遇到过如何为使用 SimpleCursorAdapter 的 ListView 实现 Filter 的问题。我遇到了这个问题,我在这个网站上找到了很多关于这个的答案。我从任何地方获取了一些代码,直到我终于让它工作,它看起来更简单。

我在 youtube 上看过 Google I/O 2010 - The world of 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 效果很好。但是在 Cursor 的情况下它不起作用,至少对我来说不起作用。也许我做错了什么。所以我有点困惑做什么。我知道我有一个编辑文本、一个列表视图,每次在我的编辑文本上放一些文本时,我都希望我的列表被过滤。

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

4

1 回答 1

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

就是这样!

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

于 2013-05-30T21:32:06.887 回答