2014-09-05 33 views
0

我使用Xamarin Android(MonoDroid)在Android 4.0(API Level 14)上制作商业应用程序。所以代码是用C#编写的。在我的应用程序中,我需要在Excel样式表中显示数据行。所以我在Horizo​​ntalScrollView里面的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; 
      } 
     } 
    } 

它通常做的是:

  1. 删除所有孩子的旧表(如果有的话)
  2. 创建的TableRow为每个记录
  3. 绘画每一行(浅灰色和深灰色,带出各行)
  4. 挂钩的Click事件每个排
  5. ***创建空TextViews的接壤(bostw)
  6. 在记录中创建的每一个数据一个TextView(22列)
  7. 添加的TableRow内的所有TextViews并添加自己的TableRow到TableLayout。
  8. ***调整每个TextView的宽度以适合它们的列内。

现在,通过所有这些步骤, 30秒来产生仅仅100行的数据。这太长而无用。关于那些***步骤,我试图取消第五步 - 因为这些边界仅用于美容目的,并且它仅加速4秒(花费26秒加载)。我还试图取消最后一步 - 这实际上是至关重要的 - 然后在20秒内,这也是不可接受的。

我尝试的另一件事是创建一个自定义的TextView来缩短代码并忽略这些重复步骤;结果效率低得多,所以我把它拿回来了。

那么,我做错了什么?是否可以在2-3秒内生成包含数百行的Excel样式表?这在一个简单的Windows窗体应用程序AFAIK中非常简单。

这里顺便输出(忽略按钮和东西):

enter image description here

+0

你确定它不是浪费时间渲染输出的浏览器吗?另外你应该知道单声道并不完全知道它是快速的[参考](http://tirania.org/blog/archive/2014/Jul-23.html) – 2014-09-05 13:42:47

+0

“Horizo​​ntalScrollView中的ScrollView内部的TableLayout对象”oO – 2014-09-05 13:55:27

+0

@ bastos.sergio'“单声道并不是因为快速而闻名” - 对不起,你不知道你在说什么。它已经[演示](http://blog.xamarin.com/android-in-c-sharp/)一遍又一遍,MonoDroid至少比基于java的dalvik基于Android的东西快4倍。 – 2014-09-05 14:30:41

回答

1

我建议使用TableView。这对设备的内存非常不利,特别是在显示大量数据时。我建议你使用ListView。定义一个ListItem,View,它看起来像表中的一行,并创建一个自定义的Adapter来填充行。 之所以这样做更好,是因为固有地,AdapterView更好地管理内存,只实例化足够的内容以显示适合屏幕的数据。因此,如果您有1000行,并且一次只能看到8行,则不会有1000行被实例化到内存中,始终只有8行。

只要记住,对于该行中的列分配Click处理程序时,请记住您分配新的之前删除的处理程序,否则你经验funkyness,因为Java的相反,你可以只设置一个单个Listener在C#中您有Event s和EventHandler s您可以基本上在Event上多次设置。

+0

经过对ListView元素的大量调查后,我最终设法转换了所有基于它的代码,它既高效,编码也不那么复杂了,非常感谢,我不需要在列,只有行,但无论如何感谢大家。 – 2014-11-03 03:06:41