我使用Xamarin Android(MonoDroid)在Android 4.0(API Level 14)上製作商業應用程序。所以代碼是用C#編寫的。在我的應用程序中,我需要在Excel樣式表中顯示數據行。所以我在HorizontalScrollView裏面的ScrollView裏面創建了一個空的TableLayout對象(它必須可以在兩個維度上滾動)。當用戶調用的數據,清理和填充用下面的函數的TableLayout(這太長,但我會解釋):TableLayout創建時間過長。我怎樣才能使它高效?
private void yenile() {
TableLayout tl = FindViewById<TableLayout> (Resource.Id.ogeler);
for (int i = tl.ChildCount - 1; i >= 0; i--) {
tl.RemoveViewAt(i);
}
int no = 1;
foreach (CSVfields kayit in Menu.records) {
if (((Torpule (kayit.zimmetliKisi) == Torpule (odabarkod)) || (Torpule (kayit.yer) == Torpule (odabarkod))) &&
((!sayilmamis) || (kayit.sayim == 0))) {
//satır oluştur ve renklendir
TableRow satir = new TableRow (this);
satir.Id = int.Parse (kayit.kunyeNo);
if(no % 2 == 0)
satir.SetBackgroundColor (Color.Gray);
else
satir.SetBackgroundColor (Color.LightGray);
if (kayit.sayim != 0)
satir.SetBackgroundColor (Color.Green);
//satır tıklanınca
satir.Click += (sender, e) => {
recIndex = Menu.records.IndexOf (kayit);
var dsorgulama = new Intent (this, typeof(DSorgulama));
dsorgulama.PutExtra ("dbarkod", kayit.kunyeNo);
StartActivityForResult (dsorgulama, 1);
};
//boşluk
TextView[] bostw = new TextView[23];
for (int i = 0; i < 23; i++) {
bostw[i] = new TextView (this);
bostw [i].SetBackgroundColor(Color.Rgb(180, 180, 180));
}
Typeface tf = Typeface.CreateFromAsset(Assets, "Fonts/calibrib.ttf");
//no
TextView notw = new TextView (this);
notw.Typeface = tf;
notw.TextSize = glob.tableTextSP;
notw.SetTextColor (Color.Black);
notw.Gravity = GravityFlags.Center;
notw.SetSingleLine();
notw.Text = no.ToString();
no++;
//foto
TextView fototw = new TextView (this);
fototw.Typeface = tf;
fototw.TextSize = glob.tableTextSP;
fototw.SetTextColor (Color.Black);
fototw.Gravity = GravityFlags.Center;
fototw.SetSingleLine();
fotoadi = kayit.kunyeNo + "-0.jpg";
if (!System.IO.File.Exists(Path.Combine(fotoDir, fotoadi))) fototw.Text = "YOK";
else fototw.Text = "VAR";
//bütçe türü
TextView butceturu = new TextView (this);
butceturu.Typeface = tf;
butceturu.TextSize = glob.tableTextSP;
butceturu.SetTextColor (Color.Black);
butceturu.Gravity = GravityFlags.Center;
butceturu.SetSingleLine();
butceturu.Text = "-----";
if (kayit.butceTuru != "")
butceturu.Text = kayit.butceTuru;
//fiyat
TextView fiyat = new TextView (this);
fiyat.Typeface = tf;
fiyat.TextSize = glob.tableTextSP;
fiyat.SetTextColor (Color.Black);
fiyat.Gravity = GravityFlags.Center;
fiyat.SetSingleLine();
fiyat.Text = "-----";
char tlsembolu = '\u00A8';
if (kayit.fiyat != "")
fiyat.Text = kayit.fiyat + " " + tlsembolu;
//taşınır adı
TextView tasinirtw = new TextView (this);
tasinirtw.Typeface = tf;
tasinirtw.TextSize = glob.tableTextSP;
tasinirtw.SetTextColor (Color.Black);
tasinirtw.Gravity = GravityFlags.Center;
tasinirtw.SetSingleLine();
tasinirtw.Text = "-----";
if (kayit.cihazinAdi != "") {
if (kayit.cihazinAdi.Length > 80)
tasinirtw.Text = kayit.cihazinAdi.Substring (0, 80);
else
tasinirtw.Text = kayit.cihazinAdi;
}
//sicil
TextView siciltw = new TextView (this);
siciltw.Typeface = tf;
siciltw.TextSize = glob.tableTextSP;
siciltw.SetTextColor (Color.Black);
siciltw.Gravity = GravityFlags.Center;
siciltw.SetSingleLine();
siciltw.Text = "-----";
if (kayit.sicilNo != "")
siciltw.Text = kayit.sicilNo;
//künye
TextView kunyetw = new TextView (this);
kunyetw.Typeface = tf;
kunyetw.TextSize = glob.tableTextSP;
kunyetw.SetTextColor (Color.Black);
kunyetw.Gravity = GravityFlags.Center;
kunyetw.SetSingleLine();
kunyetw.Text = "-----";
if (kayit.kunyeNo != "")
kunyetw.Text = kayit.kunyeNo;
//tanım
TextView tanimtw = new TextView (this);
tanimtw.Typeface = tf;
tanimtw.TextSize = glob.tableTextSP;
tanimtw.SetTextColor (Color.Black);
tanimtw.Gravity = GravityFlags.Center;
tanimtw.SetSingleLine();
tanimtw.Text = "-----";
if (kayit.tanim != "")
tanimtw.Text = kayit.tanim;
//tür
TextView turtw = new TextView (this);
turtw.Typeface = tf;
turtw.TextSize = glob.tableTextSP;
turtw.SetTextColor (Color.Black);
turtw.Gravity = GravityFlags.Center;
turtw.SetSingleLine();
turtw.Text = "-----";
if (kayit.tur != "")
turtw.Text = kayit.tur;
//zimmetli kişi
TextView zimmetlitw = new TextView (this);
zimmetlitw.Typeface = tf;
zimmetlitw.TextSize = glob.tableTextSP;
zimmetlitw.SetTextColor (Color.Black);
zimmetlitw.Gravity = GravityFlags.Center;
zimmetlitw.SetSingleLine();
zimmetlitw.Text = "-----";
if (kayit.zimmetliKisi != "")
zimmetlitw.Text = kayit.zimmetliKisi;
//yer
TextView yertw = new TextView (this);
yertw.Typeface = tf;
yertw.TextSize = glob.tableTextSP;
yertw.SetTextColor (Color.Black);
yertw.Gravity = GravityFlags.Center;
yertw.SetSingleLine();
yertw.Text = "-----";
if (kayit.yer != "")
yertw.Text = kayit.yer;
//branş
TextView branstw = new TextView (this);
branstw.Typeface = tf;
branstw.TextSize = glob.tableTextSP;
branstw.SetTextColor (Color.Black);
branstw.Gravity = GravityFlags.Center;
branstw.SetSingleLine();
branstw.Text = "-----";
if (kayit.brans != "")
branstw.Text = kayit.brans;
//marka
TextView markatw = new TextView (this);
markatw.Typeface = tf;
markatw.TextSize = glob.tableTextSP;
markatw.SetTextColor (Color.Black);
markatw.Gravity = GravityFlags.Center;
markatw.SetSingleLine();
markatw.Text = "-----";
if(kayit.marka != "")
markatw.Text = kayit.marka;
else if(kayit.markaIsmi != "")
markatw.Text = kayit.markaIsmi;
//taşınır kodu
TextView tasinirktw = new TextView (this);
tasinirktw.Typeface = tf;
tasinirktw.TextSize = glob.tableTextSP;
tasinirktw.SetTextColor (Color.Black);
tasinirktw.Gravity = GravityFlags.Center;
tasinirktw.SetSingleLine();
tasinirktw.Text = "-----";
if (kayit.tasinirKodu != "")
tasinirktw.Text = kayit.tasinirKodu;
//stokhareketid
TextView stokhareketidtw = new TextView (this);
stokhareketidtw.Typeface = tf;
stokhareketidtw.TextSize = glob.tableTextSP;
stokhareketidtw.SetTextColor (Color.Black);
stokhareketidtw.Gravity = GravityFlags.Center;
stokhareketidtw.SetSingleLine();
stokhareketidtw.Text = "-----";
if (kayit.stokHareketId != "")
stokhareketidtw.Text = kayit.stokHareketId;
//seri no
TextView serinotw = new TextView (this);
serinotw.Typeface = tf;
serinotw.TextSize = glob.tableTextSP;
serinotw.SetTextColor (Color.Black);
serinotw.Gravity = GravityFlags.Center;
serinotw.SetSingleLine();
serinotw.Text = "-----";
if (kayit.seriNo != "")
serinotw.Text = kayit.seriNo;
//lotpartino
TextView lotpartinotw = new TextView (this);
lotpartinotw.Typeface = tf;
lotpartinotw.TextSize = glob.tableTextSP;
lotpartinotw.SetTextColor (Color.Black);
lotpartinotw.Gravity = GravityFlags.Center;
lotpartinotw.SetSingleLine();
lotpartinotw.Text = "-----";
if (kayit.lotPartiNo != "")
lotpartinotw.Text = kayit.lotPartiNo;
//edinme yılı
TextView edinmeyilitw = new TextView (this);
edinmeyilitw.Typeface = tf;
edinmeyilitw.TextSize = glob.tableTextSP;
edinmeyilitw.SetTextColor (Color.Black);
edinmeyilitw.Gravity = GravityFlags.Center;
edinmeyilitw.SetSingleLine();
edinmeyilitw.Text = "-----";
if (kayit.edinmeYili != "")
edinmeyilitw.Text = kayit.edinmeYili;
//garanti süresi
TextView garantisuresitw = new TextView (this);
garantisuresitw.Typeface = tf;
garantisuresitw.TextSize = glob.tableTextSP;
garantisuresitw.SetTextColor (Color.Black);
garantisuresitw.Gravity = GravityFlags.Center;
garantisuresitw.SetSingleLine();
garantisuresitw.Text = "-----";
if (kayit.garantiSuresi != "")
garantisuresitw.Text = kayit.garantiSuresi;
//model no
TextView modelnotw = new TextView (this);
modelnotw.Typeface = tf;
modelnotw.TextSize = glob.tableTextSP;
modelnotw.SetTextColor (Color.Black);
modelnotw.Gravity = GravityFlags.Center;
modelnotw.SetSingleLine();
modelnotw.Text = "-----";
if (kayit.modelNo != "")
modelnotw.Text = kayit.modelNo;
//cihazın durumu
TextView cihazindurumutw = new TextView (this);
cihazindurumutw.Typeface = tf;
cihazindurumutw.TextSize = glob.tableTextSP;
cihazindurumutw.SetTextColor (Color.Black);
cihazindurumutw.Gravity = GravityFlags.Center;
cihazindurumutw.SetSingleLine();
cihazindurumutw.Text = "-----";
if (kayit.cihazinDurumu != "")
cihazindurumutw.Text = kayit.cihazinDurumu;
//çalışmama nedeni
TextView calismamanedenitw = new TextView (this);
calismamanedenitw.Typeface = tf;
calismamanedenitw.TextSize = glob.tableTextSP;
calismamanedenitw.SetTextColor (Color.Black);
calismamanedenitw.Gravity = GravityFlags.Center;
calismamanedenitw.SetSingleLine();
calismamanedenitw.Text = "-----";
if (kayit.calismamaNedeni != "")
calismamanedenitw.Text = kayit.calismamaNedeni;
//satırları döşe
satir.AddView (bostw[0]);
satir.AddView (notw);
satir.AddView (bostw[1]);
satir.AddView (fototw);
satir.AddView (bostw[2]);
satir.AddView (butceturu);
satir.AddView (bostw[3]);
satir.AddView (fiyat);
satir.AddView (bostw[4]);
satir.AddView (siciltw);
satir.AddView (bostw[6]);
satir.AddView (kunyetw);
satir.AddView (bostw[7]);
satir.AddView (tasinirtw);
satir.AddView (bostw[5]);
satir.AddView (tanimtw);
satir.AddView (bostw[8]);
satir.AddView (turtw);
satir.AddView (bostw[9]);
satir.AddView (zimmetlitw);
satir.AddView (bostw[10]);
satir.AddView (yertw);
satir.AddView (bostw[11]);
satir.AddView (branstw);
satir.AddView (bostw[12]);
satir.AddView (markatw);
satir.AddView (bostw[13]);
satir.AddView (tasinirktw);
satir.AddView (bostw[14]);
satir.AddView (stokhareketidtw);
satir.AddView (bostw[15]);
satir.AddView (serinotw);
satir.AddView (bostw[16]);
satir.AddView (lotpartinotw);
satir.AddView (bostw[17]);
satir.AddView (edinmeyilitw);
satir.AddView (bostw[18]);
satir.AddView (garantisuresitw);
satir.AddView (bostw[19]);
satir.AddView (modelnotw);
satir.AddView (bostw[20]);
satir.AddView (cihazindurumutw);
satir.AddView (bostw[21]);
satir.AddView (calismamanedenitw);
satir.AddView (bostw[22]);
tl.AddView (satir);
satir.SetMinimumHeight(50);
satir.BaselineAligned = false;
satir.SetGravity (GravityFlags.Center);
for (int i = 0; i < 23; i++) {
bostw[i].LayoutParameters.Width = 5;
bostw[i].LayoutParameters.Height = 50;
}
notw.LayoutParameters.Width = 52;
fototw.LayoutParameters.Width = 96;
butceturu.LayoutParameters.Width = 245;
fiyat.LayoutParameters.Width = 145;
siciltw.LayoutParameters.Width = 395;
kunyetw.LayoutParameters.Width = 295;
tasinirtw.LayoutParameters.Width = 995;
tanimtw.LayoutParameters.Width = 745;
turtw.LayoutParameters.Width = 595;
zimmetlitw.LayoutParameters.Width = 295;
yertw.LayoutParameters.Width = 395;
branstw.LayoutParameters.Width = 395;
markatw.LayoutParameters.Width = 295;
tasinirktw.LayoutParameters.Width = 195;
stokhareketidtw.LayoutParameters.Width = 195;
serinotw.LayoutParameters.Width = 195;
lotpartinotw.LayoutParameters.Width = 195;
edinmeyilitw.LayoutParameters.Width = 145;
garantisuresitw.LayoutParameters.Width = 195;
modelnotw.LayoutParameters.Width = 245;
cihazindurumutw.LayoutParameters.Width = 195;
calismamanedenitw.LayoutParameters.Width = 245;
}
}
}
它通常做的是:
- 刪除所有孩子的舊錶(如果有的話)
- 創建的TableRow爲每個記錄
- 繪畫每一行(淺灰色和深灰色,帶出各行)
- 掛鉤的Click事件每個排
- ***創建空TextViews的接壤(bostw)
- 在記錄中創建的每一個數據一個TextView(22列)
- 添加的TableRow內的所有TextViews並添加自己的TableRow到TableLayout。
- ***調整每個TextView的寬度以適合它們的列內。
現在,通過所有這些步驟, 30秒來產生僅僅100行的數據。這太長而無用。關於那些***步驟,我試圖取消第五步 - 因爲這些邊界僅用於美容目的,並且它僅加速4秒(花費26秒加載)。我還試圖取消最後一步 - 這實際上是至關重要的 - 然後在20秒內,這也是不可接受的。
我嘗試的另一件事是創建一個自定義的TextView來縮短代碼並忽略這些重複步驟;結果效率低得多,所以我把它拿回來了。
那麼,我做錯了什麼?是否可以在2-3秒內生成包含數百行的Excel樣式表?這在一個簡單的Windows窗體應用程序AFAIK中非常簡單。
這裏順便輸出(忽略按鈕和東西):
你確定它不是浪費時間渲染輸出的瀏覽器嗎?另外你應該知道單聲道並不完全知道它是快速的[參考](http://tirania.org/blog/archive/2014/Jul-23.html) – 2014-09-05 13:42:47
「HorizontalScrollView中的ScrollView內部的TableLayout對象」oO – 2014-09-05 13:55:27
@ bastos.sergio'「單聲道並不是因爲快速而聞名」 - 對不起,你不知道你在說什麼。它已經[演示](http://blog.xamarin.com/android-in-c-sharp/)一遍又一遍,MonoDroid至少比基於java的dalvik基於Android的東西快4倍。 – 2014-09-05 14:30:41