我正在使用Xamarin Android(MonoDroid)在Android 4.0(API Level 14)上制作商业应用。所以代码是在C#中。在我的应用程序中,我需要在Excel样式表中显示数据行。所以我在HorizontalScrollView内的ScrollView中创建了一个空的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;
}
}
}
它基本上是做什么的:
现在,通过所有这些步骤,它花费了大约。 30秒生成100行数据。这太长了,无法发挥作用。关于那些***步骤,我试图取消第5步 - 这些边界仅用于美容目的 - 它只是加速它4秒(加载需要26秒)。而且我也尝试取消最后一步 - 这实际上是至关重要的 - 然后需要20秒,这也是不可接受的。
我尝试的另一件事是创建一个自定义TextView来缩短代码并忽略那些重复步骤;结果效率低得多,所以我把它拿回来了。
那么,我做错了什么?是否无法在2-3秒内生成包含数百行的Excel样式表?它在一个简单的Windows窗体应用程序AFAIK中非常简单。
顺便说一下这里的输出(忽略按钮和东西):
答案 0 :(得分:1)
我建议不使用TableView
。这对设备的内存来说非常糟糕,特别是在显示大量数据时。
相反,我建议您使用ListView
。定义ListItem
,View
,它看起来像表格中的一行,并创建一个自定义Adapter
来填充行。
为什么这样做更好的原因是因为AdapterView
本身管理内存要好得多,只能实例化足够的View
s来显示适合屏幕的数据。因此,如果你有1000行,一次只能看到8行,你将不会有1000行实例化到内存中,只有8行。
请记住,在为行中的列分配Click
处理程序时,请记住在分配新的处理程序之前删除处理程序,否则将体验到时髦性,因为相反在Java中你只能在C#中设置一个Listener
,你有Event
和EventHandler
s你可以基本上在Event
上设置多次。