1

SimpleCursorAdapter を使用する ListView に Filter を実装する方法について、複数の人が問題を抱えています。私はこの問題を抱えており、この Web でこれに関する多くの回答を見つけました。最終的に機能するようになるまで、どこからでもコードを取得しましたが、見た目はより単純でした。

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

少なくとも私がやろうとしたことです。Cursor の代わりに ArrayAdapter を使用すると、かなりうまく機能することがわかりました。しかし、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 に答える