AndroidはEditText検索ボックスListViewに従ってデータを動的に表示します。
6884 ワード
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のデータも相応の変更をします。これは更新操作が必要です。メタデータセットを作成します。
コードは以下の通りです
ステップ3:EditTextのテキスト変更のモニターを追加します。
私たちはListViewの表示を動的に修正したいので、モニターに行って対応する動作をしなければなりません。监视はテキストの変更を闻いたとき、Handler postでRunnableを一つずつ変えます。
ステップ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内のデータを更新します。
コードは以下の通りです
以上のように、このダイナミックな方法は、スクリーニングの方法のような改善が必要かもしれません。コントロールはここではSampleAdapterのListviewに対してだけです。カスタムのListViewなら、また最適化が可能です。また、ListViewのheightの設定は、wrap_に設定されています。contentとfill_parentという二つの方法は実際に本物の機械に換えると、二つの差が経験できます。明らかにしましょう。下に引く過程です。
以上はAndroidです。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のダイナミック表示データの例に基づいて、必要な友達を助けたいです。ありがとうございます。