2012-04-30 21 views
4

私は約29,000レコードのレコードセットを持っています。 My Screenには、29,000件のレコードをすべて含む検索条件とリストビューのEditText Boxが含まれています。Android:大規模なArraylistから検索

リストされた方法で検索すると、必要なときにフローの出力が少なくなることはありません。

私のEditTextは

final EditText txtSearchCity = (EditText) findViewById(R.id.edtCity); 
     txtSearchCity.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void afterTextChanged(Editable s) { 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       aCountryIDTemp.clear(); 
       aCityStateTemp.clear(); 

       for (int i = 0; i < aCountryID.size(); i++) { 
        if (aCityState 
          .get(i) 
          .toLowerCase() 
          .contains(
            txtSearchCity.getText().toString() 
              .toLowerCase())) { 
         aCountryIDTemp.add(aCountryID.get(i)); 
         aCityStateTemp.add(aCityState.get(i)); 
        } 
       } 

       BindList(); 
      } 
     }); 
    } 

BindList()メソッドアダプタにArrayListのaCityStateTempを設定しているが含まれています。 他の方法で新しいArrayListを動的に検索して作成する方法。

+0

編集テキストテキストが変更されたときにデータベースを使用してLIKEクエリを実行する方がよい。 – Dharmendra

+0

@Dharmendraはこれの代わりに同じものをやっていました..しかし同じ時刻をとります。 –

+0

@Vishal Khakhkhar私はedittextに入力を与えるためにカスタムキーパッドを使用していますが、ボタンを早く押している間は遅延があります。私は助けてください助けてください助けてください –

答えて

2

高速検索のために、HashSetまたはLinkedHashSet(挿入順を維持)を使用できます。 そのクラスのcontains()メソッドを使用します。

1

私はaCityStateTempの内容を変更した後、今Adapter

の初期化中にあなたがあなたArrayListとしてAdapteraCityStateTempに合格していることを前提としています、あなただけadapter.notifyDataSetChanged()を呼び出す必要があります。アダプターにaCityStateTempを新しいArrayListとして設定する必要はありません。

+0

Adil ..あなたが示唆したように私はしていませんでしたが、今あなたが提案した方法を変えてみました。 infact adapter.notifyDataSetChanged()は、アダプタをリフレッシュするための良い方法です。同じ時間を取っている。 –

0

sqliteデータベースにすべてのデータを格納し、同様のクエリを使用して検索したアイテムを取得できます。

+0

私は前に同じことをしていましたが、同じ時間を取っていたので、このアプローチを使用しました。 –

13

私はLambdajライブラリを使用することを主張します。コレクションは、コレクションのソートとフィルタリングのためのループを制限したい場合に主に使用されます。

ここには、ArrayListのフィルタリングにlambdajを使用するための小さな例があります。

ArrayList<String> sortedArrayList = select(arrList, having(on(String.class), 
                Matchers.containsString("a"); 

これは、あなたのListViewを移入したいとArrayListをフィルタ処理完全を返します。

することもできますfilterカスタムクラス - Java: What is the best way to filter a Collection?

UPDATE:溶液上の

はそうMultiple Matchersを追加することができます回避するcase-sensitiveました。あなたは

ArrayList<String> sortedArrayList = select(arrList, having(on(String.class), 
    (Matchers.anyOf(Matchers.containsString("a"),Matchers.containsString("A"))))); 

Multiple Matchersを追加することができ、このよう

UPDATE:

さらに良い方法は、ここでfilter(Matcher<?> matcher, T...array)

を使用することです

ArrayList<String> sortedArrayList = filter(Matchers.anyOf(
      Matchers.containsString("a"),Matchers.containsString("A")), arrList); 
、あなたがそれを行うことができる方法であります

また、lambdajのメソッド/機能の一部を使用することに興味がある場合は、ソースを抽出して機能させることができます。私はfilter()

のために同じことを追加していあなただけのあなただけの整理少なくともlambdajソースから、あなたのソースに統合することができ、hamcrest-all-1.0.jar(63 kb)をダウンロードして

public static <T> List<T> filter(Matcher<?> matcher, Iterable<T> iterable) { 
    if (iterable == null) 
     return new LinkedList<T>(); 
    else{ 
     List<T> collected = new LinkedList<T>(); 
     Iterator<T> iterator = iterable.iterator(); 
     if (iterator == null) 
      return collected; 
     while (iterator.hasNext()) { 
      T item = iterator.next(); 
      if (matcher.matches(item)) 
       collected.add(item); 
     } 
     return collected; 
    } 
} 

ので、作業filter()取得するためのコードの下に追加することができます。

+2

ありがとう..その仕事.. –

+1

+1私のための新しいライブラリとクールのように見えます。 – Dharmendra

+1

優れた図書館+1 Mr Poptani。 –

関連する問題