ListView Project (5)
ListView project ေလးတစ္ခု အပ်င္းေျပ ေရးၾကည္႔ရေအာင္ဗ်ာ ... အပိုင္း ( 5 )
***********************
အရင္အပိုင္းက Custom Dialog Box ထည္႔တာကို အခက္အခဲမရွိဘူးလို႔ ယူဆပါတယ္။
အခု project က ListView project ဆိုေတာ႔ အခုအပိုင္းမွာ List အေၾကာင္း အလွည္႔ေပးၾကတာေပါ႔။ အပိုင္း (5) ေတာင္ ေရာက္ေနုျပီ List ဇာတ္လမ္းက ခုမွ စ မွာရယ္ :)
ဟုတ္ပါျပီ။ List ဆိုတာနဲ႔ -
List စာရင္း တစ္ခု ရွိကမယ္
List mList = ...
ListAdapter တစ္ခုခုေခၚကမယ္
Adapter mAdapter = ....
ListView မွာ တင္ျပကမယ္
mListView.setAdapter(mAdapter) ...
ဒါ List နဲ႔ ပက္သက္ေနသူတိုင္း မလြဲမေသြ ေရးရမယ္႔ code flow ။ တစ္ခ်ိဳ႕ ေရးလည္း ေရးဖူးေနၾကျပီ။ အခုလည္း ဒီ code flow အတိုင္းပဲ code မွာရယ္။ ဒါေပမယ္႕ ထံုးစံအတိုင္း နည္းနည္းကြဲမယ္ေပါ႔။
ဆိုေတာ႔ နံပါတ္တစ္ code flow က List စာရင္းတစ္ခု ရွိကမယ္ဆိုတဲ႔အပိုင္းမွာ -
ကိုယ္သံုးမယ္႔ List က ArrayList လား LinkedList လား List အမ်ိဳးအစား ေရြးခ်ယ္ေပးဖို႔ လိုမွာပါ။ ျပီးမွ ကိုယ္ျပမယ္႔ List က လူနာမည္စာရင္းတို႔ စာအုပ္နာမည္စာရင္းတို႔ ဆိုရင္ String (type)
နဲ႔ List ဖန္တီးရတယ္ေပါ႔။
List<String> mList = new LinkedList<String>();
mList.add("Zaw Zaw);
mList.add("Kyaw Kyaw");
....
အဲ ခက္တာက အခု က်ေနာ္တို႔ ေရးမယ္႔ List မွာက လူနာမည္တစ္မ်ိဳးထဲတင္ ပါေနတာ မဟုတ္ျပန္ဘူး။ တစ္ဦးခ်င္းစီရဲ႕ ဖုန္းနံပါတ္ေတြလည္းပါမယ္။ Level 1,2,3 ခြဲထားတဲ႔ အပိုင္းလည္း ပါေနမယ္ဆိုေတာ႔ အခုလို List စာရင္းတစ္ခုထဲ ဘယ္လိုထည္႔ရပါ႔မလဲဆိုတဲ႔ coding logic ပါလာပါျပီ။ ကဲ ဘယ္ကေန စ စဥ္းစားမလဲ? လုပ္ပါဦး။
အေပၚက လူနာမည္စာရင္းလုပ္ျပတဲ႔ ဥပမာ code ေလးရဲ႕ declare လုပ္ ေၾကျငာတဲ႔အပိုင္းေလးကို ယူေလ႔လာရေအာင္။
List<String> mList = new LinkedList<String>();
List ေနာက္မွာ annotate < > သေကၤတနဲ႔ သတ္မွတ္ထားတာက <String> တဲ႔။ ဟုတ္ျပီ။ လူနာမည္ေတြကို ေရးခ်င္ က်ေနာ္တို႔
String name = "Ko Myo";
စသည္ျဖင့္ String ဆိုတဲ႔ object type နဲ႔ ေရးၾကရတယ္။ ဒါဆို List<String> ဆိုတာ ဒီ List စာရင္းထဲမွာ ပါေနတာေတြက String ဆိုတဲ႔ object type ေတြပါလို႔ သတ္မွတ္ေပးထားရာ ေရာက္ေနတယ္ ေျပာပါေတာ႔။
ဒါဆို String ဆိုတဲ႔ type ေတြပဲ List လုပ္လို႔ရသလား? က်န္တဲ႔ object type ေတြေကာ List လုပ္လို႔ မရဘူးလားဆိုျပီး ေမးခြန္း ထုတ္ရပါမယ္။ အေျဖက ရပါတယ္တဲ႔။
EditText ေတြကိုလည္း List လုပ္လို႔ရတယ္
List<EditText> mEditTextList;
View ေတြကိုလည္း List လုပ္လို႔ရတယ္
List<View> mViewList;
ဒါဆိုရင္ ထပ္ေမးခြန္းထုတ္ပါမယ္။ Java ဟာ OOP - object-oriented programing language ျဖစ္တာေၾကာင့္ app developer တိုင္း အျပင္မွ ရွိေနတဲ႔ အရာဝတၳဳေတြ၊ သူတို႔ စိတ္ကူးထဲရွိတဲ႔ အရာဝတၳဳပစၥည္းေတြကို code နည္းအရ object ေတြအျဖစ္ ဖန္တီးေရးမယ္ ဆိုရင္ေကာ အဲ႔ဒီ object ေတြကို List တစ္ခု လုပ္လို႔ ရပါသလား? ဆိုတာပါ။ ဥပမာ
List<Car> myCarsList;
List<Dog> myDogsList;
ဟုတ္ကဲ႕ ဒီလိုကိုယ္ပိုင္ object ေတြကိုလည္း List<?> လုပ္လို႔ ရပါတယ္လို႔ အေျဖထြက္လာပါတယ္။
ဒီ ေမးခြန္းေတြက ရလာတဲ႔ logic ကေန က်ေနာ္တို႔ List အတြက္ ကိုယ္ပိုင္ object ေတြကို ဖန္တီးျပီး List ထဲမွာ ျပၾကရေအာင္ပါ။
ကိုယ္ပိုင္ object ဖန္တီးျပီး List လုပ္လို႔ရတာေတာ႔ ဟုတ္ပါျပီ။ ဘယ္လို ဖန္တီး ေရးပါမလဲ? အေျဖကေတာ႔ class ပါတဲ႔။
Java မွာ class ေတြကို object ေတြကို ဖန္တီးဖို႔ ထြင္ေပးထားျခင္း ျဖစ္တာေၾကာင့္ OOP Language လို႔ သတ္မွတ္ျခင္း ျဖစ္ပါတယ္တဲ႔။ ဥပမာ
class Car {
}
class SportCar extends Car {
}
code နည္းအရ Car တစ္စီး ေရးထုတ္ခ်င္တယ္ဆိုရင္ ေစာေစာက Car class ကို ေခၚသံုး ...
Car myCar = new Car();
စသည္ျဖင့္ေပါ႔။
က်ေနာ္တို႔လည္း ဒီ logic သေဘာတရားကို ယူျပီး က်ေနာ္တို႔ List ထဲမွာ သိမ္းမယ္႔ AIDE Group member တစ္ေယာက္ခ်င္းစီကို ကိုယ္စားျပဳ ရည္ညႊန္းတဲ႔ ကိုယ္ပိုင္ object type ကို ဖန္တီးဖို႔ class တစ္ခု ေရးရေအာင္လား။
ေနဦး member တစ္ေယာက္ခ်င္းစီကို ကိုယ္စားျပဳတဲ႔ object အတြက္ class ေရးမွာဆိုေတာ႔ class နာမည္ကို ဘယ္လိုေပးရပါ႔မလဲ?
ခပ္ဆန္းဆန္းေလး ျဖစ္ေအာင္ ဒီလို ေပးရေအာင္။ က်ေနာ္တို႔ fight တဲ႔ သူေတြကို fighter လို႔ ေခၚၾကတယ္ဆိုေတာ႔ က်ေနာ္တို႔ တစ္ေတြ တစ္ေယာက္ခ်င္းစီကလည္း AIDE အဖြဲ႕ဝင္ fighter ဆိုေတာ႔ AIDEFighter လို႔ ခပ္ဆန္းဆန္း ေပးလိုက္ရေအာင္ပါ။ ေရးလိုက္ပါ class တစ္ခု AIDEFighter အမည္သစ္နဲ႔ ... :)
public class AIDEFighter
{
}
class တစ္ခုေရးရင္ class constructor လာမယ္ (ေျပာျပီး။) ေရးလိုက္ပါ။
AIDEFighter() {
}
ေျပာခဲ႔ပါတယ္ AIDE Group member တစ္ေယာက္ခ်င္းစီရဲ႕ နာမည္ယူမယ္လို႔။
နာမည္ကို " " - String type နဲ႔ ေရးတယ္ေနာ္။
String mName;
ဒီ mName နာမည္နဲ႔ String ကို ဒီ AIDEFighter class ထဲမွာပဲ သံုးမွာမို႔ modifier က private။ modifier ဘာမွ တပ္မေပးဘူးဆိုရင္ public လို႔ ယူဆတယ္။
private String mName;
ျပီးေတာ႔ ဖုန္းနံပါတ္အတြက္။ သူ႔ကိုလည္း ဖုန္းနံပါတ္က ဂဏန္းေတြျဖစ္ေပမယ္႔လည္း String type ပဲ သံုးကမွာ။ ဘာျဖစ္လို႔လည္း ေနာင္ ဒီဖုန္းနံပါတ္ကို ယူျပီး call function ေတြဘာေတြ ထည္႔ခ်င္ေသးရင္ ACTION_CALL ေနာက္က Uri.parse( ) မွာ ဖုန္းနံပါတ္ကို String နဲ႔ ေရးေပးရတာပဲ မို႔လား။
private String mPhone;
ျပီးေတာ႔ Level အတြက္။ သူကလည္း ဂဏန္း 123 ေတြကို သံုးမွာျဖစ္တဲ႔အတြက္ int type ပဲသံုးသံုး String type သံုးသံုးရတယ္။ String type ပဲ သံုးၾကည္႔ရေအာင္။
private String mLevel;
ဒီသံုးခုက အခု class မွာ variable ေတြမဟုတ္လား။ variable ေတြဆိုေတာ႔ class ထိပ္မွာ ေၾကျငာေပးထားရမွာေပါ႔။ ဒါဆို ေရးျပီးသမွ် class က ဒီလို ျဖစ္လာျပီ။
public class AIDEFighter {
private String mName;
private String mPhone;
private String mLevel;
AIDEFighter() {
}
}
ဒီ class ကေန AIDEFighter ဆိုတဲ႔ object ေတြကို ဖန္တီး ဖန္တီးယူမွာ။ mName; mPhone တို႕ဆိုတာ ဒီ object တစ္ခုခ်င္းစီရဲ႕ နာမည္ေတြ၊ ဖုန္းနံပါတ္ေတြကို ကိုယ္စားျပဳထားလို႔ variable ေတြ။ Java မွာ object ကို instance လို႔ သံုးတယ္။ ဒါေၾကာင့္ mName တို႔ mPhone တို႔ကို instance variable ေတြလို႔လဲ သံုးတယ္။ ျပီးေတာ႔ mName တို႔ mPhone တို႔ရဲ႕ တန္ဖိုးကို ေျပာင္းေပးလိုက္တာနဲ ရလာမယ္႔ AIDEFighter object မွာ နာမည္ ရွိေနလား မေနလား စသည္... ဆိုတဲ႔ object တစ္ခုရဲ႕ အေျခအေနကိုလည္း ေျပာင္းလဲသြားေစႏိုင္လို႔ သူတို႔ကို field လို႔လည္း ေခၚႏိုင္တယ္။ instance field ေပါ႔။
အခု instance field ျဖစ္တဲ႔ mName တို႔ mPhone တို႔ တန္ဖိုးေတြကို ထည္႔ေပးႏိုင္၊ ထုတ္ေပးႏိုင္ဖို႔ method ေလးေတြ ေရးေပးဖို႔ လိုတယ္။ AIDEFighter ဆိုတဲ႔ instance (object) အတြက္ method မို႔ instance method ေတြလို႔ ေခၚမွာေပါ႔။
ဒီ method ေတြက mName, mPhone, mLevel ဒီ instance field သံုးခုရဲ႕ တန္ဖိုးေတြကို အသြင္းအထုတ္ လုပ္ဖို႔တာဝန္ယူရတဲ႔ method ေတြ။ တန္ဖိုးသတ္မွတ္တာကို set လုပ္တယ္လို႔ ေခၚျပီး တန္ဖိုး ယူျပီးထုတ္ေပးတာကို get လို႔ သံုးၾကတာဆိုေတာ႔ ဒီ method ေလးေတြကို Setters and Getters လို႔ ေရးၾက၊ ေျပာၾကတာေပါ႔။ ဆိုေတာ႔ mName instance field အတြက္ setter - getter ေရးမယ္။ method ေရးနည္းအတိုင္း -
public void setName () {
}
setName ဆိုတဲ႔ နာမည္ကိုက mName field ကို တန္ဖိုး(နာမည္) ေပးမွာ။ အဲ႔ေပးမယ္႔ နာမည္က အခုက်ေနာ္တို႔ ေရးမယ္႔ project မွာ ဘယ္က ရမလဲ Custom Dialog Box က Name အတြက္ EditText က လာရမယ္။ ဆိုေတာ႔ အဲ႔ဒီက လာတဲ႔ နာမည္(String) ကို input အဝင္လက္ခံဖို႔ အခု method ရဲ႕ input လက္ခံတဲ႔ ( ) လက္သည္းကြင္းထဲမွာ ဝင္လာမယ္႔ String type ကို name ဆိုတဲ႔ နာမည္နဲ႔ variable ေလးနဲ႔ လက္ခံမယ္။ ဆိုေတာ႔
public void setName (String name) {
}
ေဟာ ဝင္လာတဲ႔ String ကို mName ဆိုတဲ႔ တန္ဖိုးအျဖစ္ set သတ္မွတ္ေပးမွာ။
mName = name;
ဒါေၾကာင့္
public void setName (String name) {
mName = name;
}
Setter method တစ္ခု အလုပ္လုပ္ေပးတာ ဒါပါပဲ။ ျပီးရင္ Getter method အလွည္႔။ သူကက် Setter နဲ႔ ဆန္႔က်င္ဖက္ ထုတ္ေပးမွာဆိုေတာ႔ mName အတြက္ -
public void getName( ) {
}
တန္ဖိုး(နာမည္) ကို ထုတ္ေပးရမယ္ဆိုကတည္းက ထုတ္ေပးတဲ႔ return type ပါလာျပီ။ ဘာမွ ထုတ္မေပးတဲ႔ void မဟုတ္ေတာ႔ဘူး။ ထုတ္ေပးရမွာက mName ရဲ႕ တန္ဖိုး(နာမည္) ဆိုေတာ႔ String type ကို ထုတ္ေပးကမွာ။ ဒါေၾကာင့္ အေပၚက void ေနရာမွာ String ေပါ႔။
public String getName( ) {
}
ဒီ Getter method က mName မွာ ရွိေနမယ္႔ တန္ဖိုး(နာမည္) ကိုပဲ ယူျပီးထုတ္ေပးရမွာဆိုေတာ႔ input လက္ခံတဲ႕ ( ) ထဲမွာ ဘာမွ အဝင္ေတြ လက္ခံေနမွာမဟုတ္တဲ႔အတြက္ ဘာမွ ေရးစရာမလို။ အေပၚက mName တန္ဖိုးကိုပဲ ရွိေနတဲ႔အတိုင္း ယူထုတ္ေပးရမွာ။
void မဟုတ္တဲ႔ return type ပါတဲ႔ method တစ္ခုမွာ return statement နဲ႔ သူထုတ္ေပးပါမယ္လို႔ တာဝန္ယူထားတဲ႔ type ကို ျပန္ကို ထုတ္ေပးရတယ္။ မေပးရင္ AIDE က error ျပျပီး return ထည္႔ေပးပါလို႔ သတိေပးလိမ္႔မယ္။ အခု ထုတ္ေပးမယ္လို႔ တာဝန္ယူထားတာက String type; ထုတ္ေပးမယ္႔ဟာက String type ျဖစ္တဲ႔ mName ရဲ႕ တန္ဖိုး (နာမည္) ေလးကို ယူျပီးေပးကမွာဆိုေတာ႔ OK တယ္။
return mName;
ဆိုေတာ႔ ဒီ getter method အျပည္႔အစံုက ဒီလာျဖစ္လာမယ္ေပါ႔။
public String getName( ) {
return mName;
}
ကဲ mName အတြက္ setter and getter ေရးျပီးျပီဆိုေတာ႔ က်န္တဲ႔ mPhone တို႔ mLevel တို႔အတြက္ setter and getter တစ္စံုစီကို အခုအပိုင္းရဲ႕ "ကိုယ္တိုင္ code ရန္" အျဖစ္ ထားခဲ႔လိုက္ပါတယ္။
Congrats! က်ေနာ္တို႔ List စာရင္းအတြက္ ကိုယ္ပိုင္ object class ေရးျပီးသြားပါျပီ။
ဒီ object ေတြကို List လုပ္မယ္လို႔ MainActivity class ဆီသြားျပီး ေၾကျငာေပးလိုက္ရေအာင္ပါ။ List ဆိုလို႔ ဒီ project အတြက္ အသင့္ေလ်ာ္ဆံုး ArrayList အမ်ိဳးအစားကို "တိုက္ရိုက္" သံုးဖို႔ ေရြးခ်ယ္ထားပါတယ္။ ("တိုက္ရိုက္" လို႔ေျပာတာ အေၾကာင္းရွိပါတယ္။ ပံုမွန္က ဝါရင့္ Developer ၾကီးမ်ားက "Code to Interfaces, not to Implementatoins" နည္းနဲ႔ code ပါလို႔ အျမဲမွာၾကားတတ္ၾကပါတယ္။ List ဟာ Interface ျဖစ္ျပီး ArrayList တို႔ LinkedList တို႔ဟာ List Interface ကိုမွ Implementation လုပ္ထားျခင္း ျဖစ္ပါတယ္။ ဒါေၾကာင့္ List ကို declare ေၾကျငာရာမွာ
ပထမ Interface နဲ႔
List<?> mList;
ျပီးမွ Implementation အျဖစ္
mList = new ArrayList<?>;
ဆိုျပီး Interface ကို အရင္စဥ္းစားပါလို႔ rule ရွိပါတယ္။ ဒီလို Interface ကို ဦးတည္ code ထားပါက ေနာင္အခ်ိန္ အခုကိုယ္႔ List ကို performance ေၾကာင့္ပဲျဖစ္ျဖစ္ ArrayList<> မသံုးခ်င္လို႔ LinkedList<?> အမ်ိဳးအစားကို ေျပာင္းသံုးခ်င္တယ္ဆိုရင္ ဒီ List ကို ယူသံုးထားတဲ႔ app တစ္ခုလံုးက code ေတြကို လိုက္ေျပာင္းစရာမလိုပဲ အေပၚက
mList = new ArrayList<?>; ေနရာက code ကိုပဲ mList = new LinkedList<?>; လို႔ ဒီတစ္ေနရာတည္း ေျပာင္းေပးလိုက္ရံုနဲ႔ List အမ်ိဳးအစား ေျပာင္းျပီးသား ျဖစ္ေနပါမယ္တဲ႔။ )
ဒါေပမယ္႔ အခု project မွာ အေပၚမွာ ေျပာခဲ႔သလို ArrayList<> ကို တိုက္ရိုက္ေၾကျငာသံုးသြားပါမယ္။
ဒါေၾကာင့္ MainActivity class ထိပ္ဆံုးမွာ ဒီ List ကို အခုလို ေၾကျငာေပးလိုက္ရေအာင္ -
ArrayList<AIDEFighter> mList;
... လို႔ ေျပာရင္း ...
-----------------------------------------
အပိုင္း ( 6 ) ေမွ်ာ္ .... :)
ကိုမ်ိဳး
AIDE Android Lessons And Project Group
မွကူးယူတင္ထားပါသည္
#mkk_ListView
Comments
Post a Comment
Thank,s for ...