2016-04-06 2 views
1

現在、アンドロイドの簡単な単語検索プログラムを作成しようとしています。ユーザーが検索した各文字と一致し、すべての一致をローカル辞書から表示するはずです。リストビューやループを文字列配列で更新する方が効率的ですか

小さな辞書ではすべて機能していますが、大きな辞書を使用しようとするとプログラムが崩壊します。私の推測では、各単語をループする検索機能は非効率的です。

私のプロジェクトのコードは次のとおりです。前述したように

public class MainActivity extends ActionBarActivity { 
    String[] items; 
    int length; 
    ArrayList<String> listItems; 
    ArrayAdapter<String> adapter; 
    ListView listView; 
    EditText editText; 

    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     listView=(ListView)findViewById(R.id.listview); 
     editText=(EditText)findViewById(R.id.txtsearch); 
     items = readFile().split("\\n"); 
     initList(); 



     editText.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       length=s.toString().length(); 
      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       if (s.toString().equals("")) { 
        initList(); 
       } 
       else { 
        searchItem(s.toString()); 
       } 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       if (s.toString().length() < length) { 
        initList(); 
        for (String item:items) { 
         if (!item.toLowerCase().contains(s.toString().toLowerCase())) { 
          listItems.remove(item); 
         } 
        } 
       } 
      } 
     }); 
    } 

    public String readFile(){ 

     InputStream input = getResources().openRawResource(getResources().getIdentifier("words","raw", getPackageName())); 
     BufferedReader br = null; 
     StringBuilder sb = new StringBuilder(); 

     String finalstring = ""; 

     try { 
      String line; 
      br = new BufferedReader(new InputStreamReader(input)); 

      while ((line = br.readLine()) != null) { 
       // finalstring += line + "\n"; 
       sb.append(line + "\n"); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (br != null) { 
       try { 
        br.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     return sb.toString(); 

    } 

    public void searchItem (String searchword) { 
     for(String item:items){ 
      if(!item.contains(searchword)){ 
       listItems.remove(item); 
      } 
     } 
     adapter.notifyDataSetChanged(); 
    } 


public void initList(){ 

     listItems=new ArrayList<>(Arrays.asList(items)); 
     adapter=new ArrayAdapter<String>(this, R.layout.list_item, R.id.txtitem, listItems); 
     listView.setAdapter(adapter); 
    } 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

}

、私は私のSearchItem(String SearchWord)が問題であると信じているが、おそらくアダプタのデータ更新に何か問題はありますか?

注:私はブレークポイントを使用しており、SearchItem(String SearchWord)のループが呼び出されるとクラッシュします。

多くのありがとうございました!

+0

AsyncTaskを見てください。あなたはバックグラウンドスレッドで検索したいと思う。 – ElDuderino

+0

検索を開始するのが遅れているハンドラーを使うと、より良い結果が得られます。 –

答えて

1

私はEDITTEXTを変更し、代わりにsearchViewを使用。それは問題を解決しました!

0

あなたのコードをハンドラに入れて、あなたの検索のたびに実行します。

new Handler().postDelayed(new Runnable(

    public void run(){ 

     // your update code here.. 

    } 

), 3000); 

これは、ユーザーが編集テキストを入力しているときに呼吸時間と呼ばれます。入力を開始すると単語の検索は開始されませんが、3秒後に検索が開始されます。

希望すると、これが役立ちます。

0

オーケー多くの問題は、ここで私が対処したいとあります

  1. あなたが大規模なデータセットを持っており、それを検索したい場合は、私は非常にSQLiteのデータベースを使用することをお勧めします。それはまさにこのデータベースが作られたものです。常にAsyncTask

  2. ストレージ管理を考えてみましょうとして実行する必要があり、このような詳細

  3. 長時間実行タスクのStoring and Searching for Dataを参照してください!例えば。あなたのreadFileはファイルをStringに読み込み、それを配列に分割します。ロード中に直接分割しないでください。その後、すべての文字列の配列を保持し、その後にリストを作成し、その後ArrayListにコピーします。このリストから、必要のないすべてのエントリを削除します。すべてのコピー作業とコード実行の頻度がリストを投げたことを考えると、タスクを排除することで、より迅速な解決策を見つけることができると思います!

関連する問題