TableLayout创建需要太长时间。我怎样才能提高效率?

时间:2014-09-05 13:33:04

标签: c# android xamarin xamarin.android tableview

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

它基本上是做什么的:

  1. 删除旧表的所有子项(如果有)
  2. 为每条记录创建一个TableRow
  3. 绘制每一行(浅灰色和深灰色以显示行)
  4. 挂钩每行的Click事件
  5. ***为边界(bostw)
  6. 创建空TextView
  7. 为记录中的每个数据创建一个TextView(22列)
  8. 在TableRow中添加所有TextView并将TableRow本身添加到TableLayout中。
  9. ***调整每个TextView的宽度以使其适合列在其列中。
  10. 现在,通过所有这些步骤,它花费了大约。 30秒生成100行数据。这太长了,无法发挥作用。关于那些***步骤,我试图取消第5步 - 这些边界仅用于美容目的 - 它只是加速它4秒(加载需要26秒)。而且我也尝试取消最后一步 - 这实际上是至关重要的 - 然后需要20秒,这也是不可接受的。

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

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

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

    enter image description here

1 个答案:

答案 0 :(得分:1)

我建议使用TableView。这对设备的内存来说非常糟糕,特别是在显示大量数据时。

相反,我建议您使用ListView。定义ListItemView,它看起来像表格中的一行,并创建一个自定义Adapter来填充行。 为什么这样做更好的原因是因为AdapterView本身管理内存要好得多,只能实例化足够的View s来显示适合屏幕的数据。因此,如果你有1000行,一次只能看到8行,你将不会有1000行实例化到内存中,只有8行。

请记住,在为行中的列分配Click处理程序时,请记住在分配新的处理程序之前删除处理程序,否则体验到时髦性,因为相反在Java中你只能在C#中设置一个Listener,你有EventEventHandler s你可以基本上在Event上设置多次。