AndroidはEditText検索ボックスListViewに従ってデータを動的に表示します。


EditText検索ボックスListViewによると、データは必要に応じて表示されます。この中に関わるものは面白いかもしれないと思いますので、書いてみます。
まず、全体の過程を分析します。
1、layoutを作成し、EditText検索ボックスとListViewを含む。
2、データセットmDataを作成し、ListViewのためのAdapterの作成
3、EditTextのテキスト変更のモニターを追加します。
4、notifyData SetChanged()を利用してListViewを動的に更新する。
ステップ1:検索ボックスを作成します。
これはやはり簡単です。ここで使っているのはhttp://blog.csdn.net/walker02/article/details/7917392この文章のテキストボックスは、点と点のフォークを削除する機能がありますが、検索ボタンを削除しました。私たちは動的に検索しますので、ボタンが使えません。
Relativelayoutレイアウトを追加し、コントロールを2つ追加します。

効果は上の通りです。xmlコードは以下の通りです。
ステップ2:データセットを作成するmData
ここではSimpleAdapterを使用していますので、データセット作成のフォーマットはこのようにしています。自分はAdapterによってメタデータを作成し、mListTitleとmListTextに保存したデータは変更されません。mDataはテキストボックスが変更される時、mDataのデータも相応の変更をします。これは更新操作が必要です。メタデータセットを作成します。
コードは以下の通りです

  ListView mListView;
  
  ArrayList<map<string, object="">> mData = new ArrayList<map<string, object="">>();
  
  ArrayList<string> mListTitle = new ArrayList<string>();
  ArrayList<string> mListText = new ArrayList<string>();
   
  private void getmData(ArrayList<map<string, object="">> mDatas)
  {
    Map<string, object=""> item = new HashMap<string, object="">();
    mListTitle.add(This is a title!);
    mListText.add(this is a text.
2014.09.18.16.33);
 
    item.put(title, mListTitle.get(0));
    item.put(text, mListText.get(0));
    mDatas.add(item);
    mListTitle.add(This is an another title!);
    mListText.add(this is an another text.
2014.09.18.16.33);
  
    item = new HashMap<string, object="">();
    item.put(title, mListTitle.get(1));
    item.put(text, mListText.get(1));
    mDatas.add(item);
  }</string,></string,></string,></map<string,></string></string></string></string></map<string,></map<string,>
またmDataを利用してAdapterを作成します。

private void set_mListView_adapter()
{
 mListView = (ListView) findViewById(R.id.mListView);
  
 getmData(mData);
  
 adapter = new SimpleAdapter(this,mData,android.R.layout.simple_list_item_2, 
   new String[]{title,text},new int[]{android.R.id.text1,android.R.id.text2});
  
 mListView.setAdapter(adapter);
}
これでプログラムが開始された状態が表示されます。検索ボックスがないなら、ここでいいです。
ステップ3:EditTextのテキスト変更のモニターを追加します。
私たちはListViewの表示を動的に修正したいので、モニターに行って対応する動作をしなければなりません。监视はテキストの変更を闻いたとき、Handler postでRunnableを一つずつ変えます。

private void set_eSearch_TextChanged()
{
 eSearch = (EditText) findViewById(R.id.etSearch);
   
 eSearch.addTextChangedListener(new TextWatcher() {
    
   @Override
   public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub
    //                 ,       。
   }
    
   @Override
   public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
      int arg3) {
    // TODO Auto-generated method stub
    //               
   }
    
   @Override
   public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    /**                
     *          ,         ,   listview           ,           。
     *                     。
     */
    if(s.length() == 0){
      ivDeleteText.setVisibility(View.GONE);//       ,     
    }
    else {
      ivDeleteText.setVisibility(View.VISIBLE);//        ,    
      myhandler.post(eChanged);
    }
   }
 });
   
}
Handlerはここで大きな用途を表しています。Handlerのこのようなポスト機能によって、インタフェースなどを自分の欲しいものに変えられます。ListViewの修正だけではなく、文字を入力するごとにフォントの色を変えてもいいです。
ステップ4:notifyData SetChangd()を利用してListViewを動的に更新する。
本題に戻ります。ここは一番重要なステップです。私達のpostが出てきました。テキストボックスのテキストを検索してからメタデータをフィルタして、該当するデータをListViewに表示させます。
(/**またの、S 4を突いてブログを書いているのは罪ではないですか?*/)
adapperにはnotifyData SetCharnged()の方法があり、データ更新時にこの方法を使ってバインディングされたListViewを更新することができます。効果は以下の通りです。

5を入力しますか?それとも2つのitemがありますか?私の選択は、titleとtextがテキストボックスの文字を含むのでさえすれば、つまりターゲットアイテムです。

50を入力すると、一つのアイテムの中のtitleまたはtextだけのテキストに検索ボックスのテキストが含まれていますので、この一つだけを表示します。

もう一つの0を加えると、itemのテキストは500を含んでいませんので、Listviewにはitemがありません。
効果的で、本当に素晴らしいです。LZのレベルが多すぎて、ちょっと問題がありました。
ここでいくつかの問題が発生するかもしれません。
1、notifyData SetChanged()、これは更新されました。mDataデータセットも確かに変わりましたが、ListViewは更新されていません。以前はこのようにしていましたが、後でmdataデータセットの引用が変わったので、Adapterがnotifyを使ってもいいです。AdapterはmDataとの引用結合です。引用が変わったら、データはListViewに更新されません。これも私がget関数パラメータを使っているのは、引用が入ってくる原因を伝達するためであり、直接引用を返したら、この問題が発生しますので、この点に注意してください。参照できる/kf/201401/273017.
2、インターフェースUIの更新については、Handlerを使用して、PostのRunnableを通じて更新することができます。Runnableは検索ボックスのテキストに従ってmData内のデータを更新します。
コードは以下の通りです

Runnable eChanged = new Runnable() {
   
 @Override
 public void run() {
   // TODO Auto-generated method stub
   String data = eSearch.getText().toString();
    
   mData.clear();
    
   getmDataSub(mData, data);
    
   adapter.notifyDataSetChanged();
    
 }
};
3、mDataの理解に問題があるかもしれません。データの更新後、毎回のスクリーニングデータはmDataに入れています。元のデータはもちろんmListTitleとmListTextにあります。取得したデータのgetmDataSubコードから分かります。

private void getmDataSub(ArrayList<map<string, object="">> mDataSubs, String data)
{
  int length = mListTitle.size();
  for(int i = 0; i < length; ++i){
   if(mListTitle.get(i).contains(data) || mListText.get(i).contains(data)){
    Map<string,object> item = new HashMap<string,object>();
    item.put(title, mListTitle.get(i));
    item.put(text, mListText.get(i));
    mDataSubs.add(item);
   }
  }
} </string,object></string,object></map<string,>
4、テキストボックスは最初のものなので、プログラムが実行されるとテキストボックスはフォーカスを得て、入力方法をポップアップします。ここでは、xmlファイルに長さ0のLinear Layoutを追加して焦点を合わせます。コードは以下の通りです。
以上のように、このダイナミックな方法は、スクリーニングの方法のような改善が必要かもしれません。コントロールはここではSampleAdapterのListviewに対してだけです。カスタムのListViewなら、また最適化が可能です。また、ListViewのheightの設定は、wrap_に設定されています。contentとfill_parentという二つの方法は実際に本物の機械に換えると、二つの差が経験できます。明らかにしましょう。下に引く過程です。
以上はAndroidです。EditText検索ボックスListViewのダイナミック表示データの例に基づいて、必要な友達を助けたいです。ありがとうございます。