2014-09-05 78 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