2011-08-01 143 views
6

在我的Listview,我有文字和圖像,它們存儲在ArrayListBaseAdapter Listview過濾Android

我使用BaseAdapter來顯示列表。

我想根據EditText中鍵入的文本使用filter,但不起作用。

我的代碼是:進階是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 

      } 
     }); 

而且我BaseAdapter工具Filterable所以在這個getFilter方法是:

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

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

    } 
} 

在那mNames是我想要過濾ListViewArrayList

也啓用setTextFilterEnabled(true).,但過濾不起作用。

這是正確的方法嗎?它有什麼問題?如果不是,該怎麼做?

+0

你解決這個問題?你能給我們一個反饋嗎? – 2011-09-09 10:59:29

+0

不,我沒有解決,這是我保持打開!如果你有這麼請在這裏發帖Thanx – Udaykiran

+0

如何在ArrayList中保存文本和圖像 ??? –

回答

0

這個API演示示例

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