2011-08-01 9 views
6

私のListviewには、テキストと画像があり、ArrayListに格納されています。BaseAdapter Listview Androidのフィルタリング

私はBaseAdapterを使用してリストを表示しています。

EditTextに入力されたテキストに基づいてリストにfilterを使用したいですが、機能しません。

私のコードは次のとおりです。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 

      } 
     }); 

ですそして、私のBaseAdapterFilterableを実装ようで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は、ListViewをフィルタリングするArrayListです。

setTextFilterEnabled(true).も有効ですが、フィルタリングは機能しません。

このアプローチは正しいですか?何が間違っている?そうでない場合、それを行う方法?

+0

あなたはこの問題を解決しましたか?フィードバックをお願いしますか? –

+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; 
    } 
} 
関連する問題