BaseAdapter Favorite Attribute List Filter

In my Listview , I have text and image, and they are stored in an ArrayList .

I am using BaseAdapter to display a list.

I want to use filter in a list based on the text typed in EditText , but it doesn't work.

My code: adv - EditText

  adv.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub viewadapter.getFilter().filter(s); } @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 } }); 

And my BaseAdapter implements the Filterable so getFilter in that:

 @Override public Filter getFilter() { // TODO Auto-generated method stub if (mFilter == null) { mFilter = new ArrayFilter(); } return mFilter; } 

and my ArrayFilter :

  private class ArrayFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence prefix) { FilterResults results = new FilterResults(); if (mNames == null) { synchronized (mLock) { mNames = new ArrayList<String>(mObjects); } } if (prefix == null || prefix.length() == 0) { synchronized (mLock) { ArrayList<String> list = new ArrayList<String>(mNames); results.values = list; results.count = list.size(); } } else { String prefixString = prefix.toString().toLowerCase(); final ArrayList<String> values = mNames; final int count = values.size(); final ArrayList<String> newValues = new ArrayList<String>(count); for (int i = 0; i < count; i++) { final String value = values.get(i); final String valueText = value.toString().toLowerCase(); // First match against the whole, non-splitted value if (valueText.startsWith(prefixString)) { newValues.add(value); } else { final String[] words = valueText.split(" "); final int wordCount = words.length; for (int k = 0; k < wordCount; k++) { if (words[k].startsWith(prefixString)) { newValues.add(value); break; } } } } results.values = newValues; results.count = newValues.size(); } return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { //noinspection unchecked mObjects = (List<String>) results.values; if (results.count > 0) { viewadapter.notifyDataSetChanged(); } else { viewadapter.notifyDataSetInvalidated(); } } } 

in that mNames is an ArrayList that I want to filter Listview .

and also included setTextFilterEnabled(true). but filtering does not work.

Is this the right approach? What's bad about it? if not, how to do it?

+6
source share
1 answer

this API demo example

 public class SearchViewFilterMode extends Activity implements SearchView.OnQueryTextListener { private static final String TAG = "SearchViewFilterMode"; private SearchView mSearchView; private ListView mListView; private ArrayAdapter<String> mAdapter; private final String[] mStrings = Cheeses.sCheeseStrings; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_ACTION_BAR); setContentView(R.layout.searchview_filter); mSearchView = (SearchView) findViewById(R.id.search_view); mListView = (ListView) findViewById(R.id.list_view); mListView.setAdapter(mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings)); mListView.setTextFilterEnabled(true); setupSearchView(); } private void setupSearchView() { mSearchView.setIconifiedByDefault(false); mSearchView.setOnQueryTextListener(this); mSearchView.setSubmitButtonEnabled(false); mSearchView.setQueryHint(getString(R.string.cheese_hunt_hint)); } public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { mListView.clearTextFilter(); } else { mListView.setFilterText(newText.toString()); } return true; } public boolean onQueryTextSubmit(String query) { return false; } } 
0
source

Source: https://habr.com/ru/post/894038/


All Articles