Динамически сгенерированные макеты занимают много времени, как сделать его более эффективным, android

#android #layout

#Android #макет

Вопрос:

Привет, я создаю динамические линейные макеты и текстовые представления внутри и устанавливаю события onclick для каждого textview, но поскольку данные из запроса sqlite, который я делаю, большие, для завершения привязки требуется много времени (около 5-6 секунд), может ли кто-нибудь направить меня к гораздо более эффективному способу сделать то, что я делаюхотите достичь? Я не могу использовать ListView, потому что это продолжающийся текст, который не должен быть разделен, я попытался вызвать

я пытался сделать что-то вроде этого

   onCreate(...){...
  Runnable r = new Runnable() {
    public void run() {
    filldata(BID,CID);// add 30 views
    }
};
LinearEn.post(r);// this is the main linearlayout that i add views and layers to it

 }

 public void filldata(idB, idC){
   ....

   for(i=0;i<VerseArr.length;i  ){ // this is the for loop that holds select query sqlite

            LinearLayout linearLayout = new LinearLayout(this);
            linearLayout.setOrientation(LinearLayout.HORIZONTAL);

            LinearLayout Infant1Layout = new LinearLayout(Reads.this);
            LinearLayout Infant2Layout = new LinearLayout(Reads.this);

            LinearLayout.LayoutParams linearParams2 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
            linearParams2.gravity=Gravity.CENTER;
            Infant2Layout.setLayoutParams(linearParams2);

            LinearLayout.LayoutParams linearParams1 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
            linearParams1.gravity=Gravity.CENTER;
            linearParams1.setMargins(0,0,15,0);
            Infant1Layout.setLayoutParams(linearParams1);
            Infant1Layout.setOrientation(LinearLayout.HORIZONTAL);

            TextView BookTxt=new TextView(Reads.this);
            TextView BookVerseNum=new TextView(Reads.this);

            BookTxt.setText(Html.fromHtml("<font color='#FFFFFF'>" VerseArr[i] "<font>"));
            BookTxt.setTypeface(tf);
            BookTxt.setFadingEdgeLength(10);
            BookTxt.setTextSize(17.2f);
            int currentAPIVersion = android.os.Build.VERSION.SDK_INT;

            if (currentAPIVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) {
                BookTxt.setTextIsSelectable(true);
            }

            BookTxt.setPadding(0, dpToPx(3), dpToPx(5), 0);

            BookVerseNum.setText(Html.fromHtml("<small><font color='#F9F9F9'>" (i 1) "<font></small>"));
            BookVerseNum.setTypeface(tf);
            BookVerseNum.setFadingEdgeLength(10);
            BookVerseNum.setTextSize(20.2f);
            BookVerseNum.setPadding(dpToPx(valuePad), dpToPx(3), dpToPx(5), dpToPx(3));
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
            params.setMargins(0,0, 0, 4);
            linearLayout.setLayoutParams(params);
            Infant1Layout.addView(BookVerseNum);

            View v = new View(this);
            v.setLayoutParams(new LinearLayout.LayoutParams(
                    1,LayoutParams.MATCH_PARENT));
            v.setBackgroundColor(Color.parseColor("#B3B3B3"));
            v.setPadding(dpToPx(15), 0, dpToPx(15), dpToPx(3));

            Infant1Layout.addView(v);
            Infant2Layout.addView(BookTxt);
            linearLayout.addView(Infant1Layout);
            linearLayout.addView(Infant2Layout);
            LinearEn.addView(linearLayout);
        }   


  }
  

Комментарии:

1. Я думаю, что если вы создадите XML-макет (ы) и обработаете их в коде, это может быть полезно.

2. Почему бы вам не создать свой вид с помощью файла XML-макета? Трудно сказать, какое представление вы пытаетесь создать, но оно в значительной степени похоже на список или что-то подобное.

3. просто используйте ListView, я не вижу причин, по которым вы не можете этого сделать

4. потому что мне иногда нужно создать 30 макетов, а иногда 10

5. @Deron: A ListView обработает это автоматически. Все, что вам нужно сделать, это создать XML-макет элемента списка, а затем использовать его с каким-то Adapter с ListView помощью . Android хорош в таких вещах и очень быстр.

Ответ №1:

Да, потому что

 for(i=0;i<VerseArr.length;i  ) 
  

здесь на основе VerseArr.length , скажем, 20, будет создано столько просмотров, что это займет время, иногда, если их будет больше, скажем, 300 или около того, это может также дать нам ООМ.

Но все же я пробовал динамически создавать представления для 4-5 или около того, но это не займет так много времени, что я могу вам предложить, так это сохранить готовые данные, которые необходимо добавить, и попытаться reuse the views instead of creating it every time