ListView Project (9)









ListView project ေလးတစ္ခု အပ်င္းေျပ ေရးၾကည္႔ရေအာင္ဗ်ာ ... အပိုင္း ( 9 )
***********************

အခု အပိုင္းမွာ Level Button ကိုႏွိပ္ရင္ List ထဲက သက္ဆိုင္ရာ Level ရွိတဲ႔သူေတြကို filter စစ္ျပေပးရမွာ ျဖစ္ပါတယ္။ ဒီလို ျဖစ္ဖို႕ code ရာမွာ က်ေနာ္႔အေနနဲ႔ "ဒီလို code မွမွန္တယ္" လို႔ ေျပာခ်င္းမ်ိဳးမဟုတ္ပဲ "ေၾသာ္ ဒီလို code လည္း ရလဒ္က အတူတူပါပဲလား" ဆိုတဲ႔ code logic ကို ခ်ေပးျခင္းသာ ျဖစ္ပါတယ္။

ကဲ ရွိေနတဲ႕ List စာရင္းထဲက လိုခ်င္တဲ႔ data ကို ရေအာင္စစ္ပါမယ္။ တိတိက်က်ေျပာရရင္ List ထဲမွာ ရွိေနတဲ႔ AIDEFighter object ေတြဆီက Level field က တန္ဖိုးကို ၾကည္႔ျပီး စစ္မယ္ေပါ႔။

ဒါဆို code flow ခ်ၾကည္႔ရင္ Level Button တစ္ခုခုကို ႏွိပ္လိုက္ရင္ အဲ႔ Button ကေန "ေဟ႔ List ထဲ ဒီ data ပါလား။ ပါတဲ႔သူေတြကို List ထဲကေန စစ္ထုတ္ျပစမ္း" ဆိုျပီး data စစ္ေပးမယ္႔ method တစ္ခုကို data တစ္ခု ေပးျပီး ခိုင္းမယ္ေပါ့။ method ကေန Button က ေပးလာတဲ႔ data နဲ႔ List ထဲက object ေတြရဲ႕ data ကို တိုက္စစ္ျပီး data ပါတဲ႔ အဲ႔ object ေလးကို ေရြးထုတ္ထုတ္သြားမယ္ဆိုရင္ အခု လိုခ်င္တဲ႕ Level filter code flow ရရွိလာမွာ ျဖစ္ပါတယ္။ ကဲ ဒါဆို အဲ႔ဒီ method ေလးကို
showFilteredList ဆိုတဲ႔ နာမည္နဲ႔ ေရးေပးလိုက္ရေအာင္။ MainActivity class ထဲမွာပါ။ ဒီ method က အျခား class ေတြကေန လွမ္းမသံုးပဲ အခု class ထဲမွာတင္ သံုးမွာမို႔ private scope နဲ႔ ေရးပါ။

private void showFilteredList() {

}

Level Button တစ္ခုက တိုက္စစ္ဖို႔ ေပးလာမယ္႔ data ကို input လက္ခံရယူဖို႔ String type တစ္ခုနဲ႔ သတ္မွတ္ေပးပါ။

private void showFilteredList(String filter) {

}

ဒီေနရာမွာ စဥ္းစားရပါမယ္။ Level ေတြအမ်ိဳးမ်ိဳးနဲ႔ ရွိေနတဲ႔ မူလ mList ဆိုတဲ႔ စာရင္းၾကီး တစ္ခု ရွိေနတယ္။ ေနာက္ထပ္ Level တုူတဲ႔ object ေတြသပ္သပ္ ေရြးထုတ္ျပီး List စာရင္းတစ္ခု လုပ္ျပီးျပေပးရဦးမယ္ဆိုေတာ႔ မူလ mList စာရင္းၾကီးကို မတို႔မထိပဲ တိုက္စစ္ရံုပဲထားျပီး ေနာက္ထပ္ List စာရင္းအသစ္တစ္ခု ဖန္တီးေပးလိုက္ရင္ အဆင္ေျပႏိုင္ပါတယ္။ ဒီ List စာရင္းအသစ္ကလည္း AIDEFighter object ေတြပဲ ပါေနမွာဆိုေတာ႔ class ထိပ္မွာ ေၾကျငာေပးလိုက္ပါ။

ArrayList<AIDEFighter> newList;

ျပီးရင္ Java မွာ အေရးၾကီးတဲ႔ newList အတြက္ initialization ကို new keyword နဲ႔ onCreate(...) ထဲမွာ လုပ္ေပးရမွာပါ။ ( ဒီ "new" operator က ဒီ List အတြက္ memory ထဲမွာ ေနရာယူေပးတာ ျဖစ္ပါတယ္။ memory allocate လုပ္တယ္လို႔ သံုးပါတယ္။ )

newList = new ArrayList<AIDEFighter>();

ဒါဆို List အသစ္အတြက္ ျပင္ဆင္မႈအပိုင္းက ျပီးသြားျပီ ျဖစ္ပါတယ္။ ကဲ ေစာေစာက showFilteredList() method ထဲ ဆက္ေရးပါမယ္။

မူရင္း mList စာရင္းၾကီးထဲက ရွိသမွ် AIDEFighter object ေလးေတြ တစ္ခုခ်င္းစီကို for loop နဲ႔ ယူပါမယ္။

for(AIDEFighter fighter: mList) {

}

ဒီ အေပၚက for loop code က ရိုးရိုး for loop ပတ္တာနဲ႔ အတူတူပဲ ျဖစ္ပါတယ္။

=

for(int i = 0; i < mList.size(); i++) {

AIDEFighter fighter = mList.get(i);

}

ရလာမယ္႔ AIDEFighter object တစ္ခုခ်င္းစီက Level field က တန္ဖိုးကို AIDEFighter object ရဲ႕ က်ေနာ္တို႔ေရးခဲ႔တဲ႔ getter method တစ္ခုျဖစ္တဲ႔ getLevel() method နဲ႔ ယူလိုက္ပါမယ္။

fighter.getLevel();

ရလာတဲ႔ Level field တန္ဖိုးဟာ အေပၚက input အျဖစ္ Level Button တစ္ခုခုဆီက လက္ခံထားတဲ႔ String Type ျဖစ္တဲ႔ filter (String) ေလးနဲ႔ equals တူေနသလားလို႔ တိုက္စစ္ပါမယ္။

fighter.getLevel().equals(filter)

တူေနမယ္/မတူဘူးဆိုတဲ႔ အေျခအေနႏွစ္မ်ိဳး boolean တန္ဖိုး true or false အရ တူေနမယ္ ဆိုပါမွ ဒီ fighter object ေလးကို က်ေနာ္တို႔ အသစ္ဖန္တီးထားတဲ႔ List စာရင္းအသစ္ newList ထဲ ထည္႔ခ်င္တာမို႔ if block နဲ႔ ခံေရးပါမယ္။ ဒါဆို ဒီလို ရလာမွာ ျဖစ္ပါတယ္။

for(AIDEFighter fighter: mList) {
if(fighter.getLevel().equals(filter)) {
newList.add(fighter);
}
}

ဒီ code နဲ႔ မူရင္း mList စာရင္းထဲက AIDEFighter object အားလံုးကို တိုက္ဆိုင္ စစ္ေဆးျပီး List အသစ္ ရျပီဆိုမွ FighterAdapter instance တစ္ခုဖန္တီးဖို႔  FighterAdapter class က (constructor ကေန) ေတာင္းထားတဲ႔ "this" reference နဲ႔ ဒီစာရင္းအသစ္စက္စက္ကို ထည္႕ေပးလိုက္ျပီး

FighterAdapter adapter = new FighterAdapter(this,newList);

(newList နဲ႔ mList မွားထည္႔ေနပါဦးမယ္။)

က်ေနာ္တို႔ရဲ႕ တစ္ခုတည္းေသာ ListView ေပၚမွာ တင္ျပရမွာ ျဖစ္ပါတယ္။

mListView.setAdapter(adapter);

data စစ္ျပီး list ထဲ ထည္႔ျပေပးတဲ႔ အပိုင္းေတာ႔ ရေနပါျပီ။ ဒါေပမယ္႔ app သံုးသူ user က Level Button ကို ထပ္ခါတလဲလဲ ႏွိပ္ေနရင္ list ထဲ item တူတာေတြ ထပ္တလဲလဲ ထပ္ေရာက္လာပါမယ္။ ဒါကိုကာကြယ္ဖို႔ newList ထဲ item စ "မထည္႔ခင္တိုင္း" newList ထဲက item အေဟာင္းေတြကို
List တစ္ခုရဲ႕ မူလပါ clear() method နဲ႔ (List မွာ item ရွိရွိ/မရွိရွိ) ဖယ္ရွားေပးေပးထားလိုက္ပါ။

ဒါေၾကာင့္ showFilteredList() method အခုလို ရလာမွာ ျဖစ္ပါတယ္။

private void showFilteredList(String filter) {

newList.clear();
for(AIDEFighter fighter: mList) {
if(fighter.getLevel().equals(filter)) {
newList.add(fighter);
}
}
FighterAdapter adapter = new FighterAdapter(this,newList);
mListView.setAdapter(adapter);
}

ဒီ method ကို Level Button စစ္တဲ႔ ေရးျပီးသား onClick method အတြင္းေတြဆီကေန ကိုယ္ စစ္ရမယ္႔ Level ကို လိုက္ျပီး စစ္ရမယ္႔ data ကို String type နဲ႔ စစ္ခိုင္းလိုက္ပါ။

ဥပမာ Level one Button onClick method အတြင္းကေနဆို

showFilteredList("1");

Level Two Button onClick method အတြင္းကေနဆို

showFilteredList("2");

Level Two Button onClick method အတြင္းကေနဆို

showFilteredList("2");

ကဲ code ျပီးသြားျပီဆို App ကို Build လုပ္ျပီး New Member ေတြကို Level 1/2/3 အမ်ိဳးမ်ိဳးေပးျပီး Level စစ္ၾကည္႔လိုက္ပါဦး။

ဒီေနရာမွာ က်ေနာ္တို႔ New Member Box မွာ Level အတြက္ EditText နဲ႔ input ယူထားတာပါ။ အျပင္လက္ေတြ႕ app မွာေတာ႔  Level 1/2/3 Radio Button ေလးေတြနဲ႔ ဖန္တီးသံုးေပးမွ ပိုအဆင္ေျပမွာပါ။ အခု project ကေတာ႔ ListView နဲ႔  သက္ဆိုင္တဲ႔ code flow ကို ေရးသြားတာမို႔ EditText နဲ႔ပဲ input ယူသံုးသြားျခင္း ျဖစ္ပါတယ္။

ေနာက္တစ္ခ်က္က ဖုန္းကို Rotate လုပ္ရင္ ListView မွာ data ေတြေပ်ာက္သြားတာ သတိထားမိမွာပါ။ ဒါကို AndroidManifest.xml ထဲက <activity tag မွာ

android:configChanges="keyboardHidden|orientation|screenSize"

ဆိုတာ ထည္႔ေပးျခင္းျဖင့္ ျပင္ဆင္ fix လုပ္ေပးရမွာ ျဖစ္ပါတယ္။

ကဲ ဒီအပိုင္း ဒီေလာက္ပါပဲ။ ေနာက္ဆံုးအပိုင္း (10) မွာေတာ႔ က်ေနာ္တို႔ရဲ႕ List data ေတြကို save လုပ္ သိမ္းေပး ျပန္ေခၚတဲ႔ အပိုင္းကို code သြားၾကရေအာင္ပါလို႔ ေျပာရင္း ....

ေနာက္ဆံုးအပိုင္း ( 10 ) ေမွ်ာ္ ... :)

-----------------------------------------

ကိုမ်ိဳး

AIDE Android Lessons And Project Group

မွ ကူးယူတင္ထားပါသည္


#mkk_ListView


Comments

Popular posts from this blog

♡ မဂၤလာခြန္းဆက္ ♡

《《 ဝမ္းနည္းပါေၾကာင္း 》》