Android: раздувание макета занимает много времени - PullRequest
3 голосов
/ 10 марта 2012

Нашли решение!

Теперь я использую ViewPager вместо ViewFlipper.Представления теперь генерируются в моем методе run () (который уже существует, потому что я получаю данные из Интернета) и сохраняются на карте.В моем обработчике я вызываю только pagerAdapter.notifyDataSetChanged (). PagerAdapter использует карту представлений, и он работает плавно и быстро.Так что теперь я ищу возможность бесконечной прокрутки ViewPager, но это еще одна проблема, не связанная с ней;)

Спасибо всем за ответы и продолжайте в том же духе.

Я довольно новичок в разработке Android и столкнулся с проблемой при надувании (огромного) макета.Я получаю некоторые данные из веб-службы, которая работает нормально, а затем я использую обработчик в своей деятельности, чтобы перенести эти данные в веб-интерфейс.Вот мое дескриптор дескриптора:

    public void handleMessage(Message msg) {
        LayoutInflater inflater = getLayoutInflater();

        List<Integer> gamedays = new ArrayList<Integer>(games.keySet());
        Collections.sort(gamedays);

        for (Integer gameday : gamedays) {

            View gamedaytable = inflater.inflate(R.layout.gamedaytable, null);
            TableLayout table = (TableLayout) gamedaytable.findViewById(R.id.gameDayTable);
            table.removeAllViews();
            List<Game> gamelist = games.get(gameday);
            int rowcount = 2;
            for (Game game : gamelist) {

                View tableRow = inflater.inflate(R.layout.gamedayrow, null);

                TextView homeTeam = (TextView) tableRow.findViewById(R.id.gameDayHome);
                TextView awayTeam = (TextView) tableRow.findViewById(R.id.gameDayAway);
                TextView gameResult = (TextView) tableRow.findViewById(R.id.gameDayResult);
                gameResult.setBackgroundResource(R.drawable.resultbackground);
                homeTeam.setText(game.getHomeTeam().getName());
                awayTeam.setText(game.getAwayTeam().getName());
                if (game.getHomegoals() < 0 || game.getAwaygoals() < 0) {
                    gameResult.setText("-:-");
                } else {
                    gameResult.setText(game.getHomegoals() + ":" + game.getAwaygoals());
                }

                if (rowcount % 2 == 0) {
                    tableRow.setBackgroundColor(0xffdee0dd);

                } else {
                    // setting alternative background
                    tableRow.setBackgroundColor(0xfff1f3f0);
                }
                rowcount++;

                table.addView(tableRow);
            }
            flipper.addView(gamedaytable);
        }
        flipper.setDisplayedChild(thisgameday - 1);
        pd.dismiss();

    }

Моя проблема в том, что этот код работает довольно медленно, и d процессный диалог останавливается примерно на 1 секунду, прежде чем он исчезает и отображается макет.Игры состоят из 34 записей, которые содержат 9 записей.Поэтому я добавляю 34 представления, состоящие изlativeLayout (), который содержит таблицу. Я думаю, проблема в том, что Android начинает рисовать и вычислять макет, и это занимает слишком много времени.Если я прав, я не могу использовать AsynTask, потому что я не могу там делать вещи из UI, и я делаю только вещи из UI.

Я искал способ, чтобы диалоговое окно процесса не зависало при этом.Или, может быть, я делаю что-то совершенно неправильно

R.layout.gamedaytable:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff1f3f0"
android:focusableInTouchMode="false" >

<TableLayout
    android:id="@+id/gameDayTable"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:focusableInTouchMode="false" >
</TableLayout>

</RelativeLayout>

R.layout.gamedayrow:

<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tableRow1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusableInTouchMode="false"
android:paddingBottom="5dp"
android:paddingTop="5dp" >

<TextView
    android:id="@+id/gameDayHome"
    style="@style/textsizeSmallScreen"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:text="Mannschaft 1" />

<TextView
    android:id="@+id/textView2"
    style="@style/textsizeSmallScreen"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:text=":" />

<TextView
    android:id="@+id/gameDayAway"
    style="@style/textsizeSmallScreen"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Mannschaft 2" />

<TextView
    android:id="@+id/gameDayResult"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="5dp"
    android:background="@drawable/resultbackground"
    android:paddingLeft="10dip"
    android:text="0:5"
    android:textColor="#FFFFFF"
    android:textSize="11dp"
    android:textStyle="bold"
    android:typeface="monospace" />

</TableRow>

Дополнительная информация: Этокак должна выглядеть таблица.Так что я не уверен, что это действительно ListView, потому что для меня его tabledata;)

table

Ответы [ 4 ]

4 голосов
/ 10 марта 2012

Похоже, вы строите список, вам, вероятно, стоит взглянуть на использование ListView, которое будет иметь преимущества, заключающиеся в том, что вам нужно будет только создать пользовательский интерфейс для количества отображаемых в данный момент строк, а также использовать повторное использование представления. , так что вам не нужно раздувать столько строк.

2 голосов
/ 10 марта 2012

нашел решение!

Теперь я использую ViewPager вместо ViewFlipper. Представления теперь генерируются в моем методе run () (который уже существует, потому что я получаю данные из Интернета) и сохраняются на карте. В моем обработчике я вызываю только pagerAdapter.notifyDataSetChanged (). PagerAdapter использует карту представлений, и он работает плавно и быстро. Так что теперь я ищу возможность бесконечной прокрутки ViewPager, но это еще одна проблема, не связанная с ней;)

Спасибо всем за ответы и продолжайте в том же духе.

1 голос
/ 10 марта 2012

Лучше пойти на Listview.Даже мы можем добавить более одного дизайна строк в виде списка оптимизированным способом, что улучшит производительность.

0 голосов
/ 10 марта 2012

Вы определенно можете сделать это на AsyncTask. Хотя вы не можете обновить пользовательский интерфейс для метода doInBackground в AsyncTask, вы можете сделать это из onProgressUpdate.

Я бы разбил код, чтобы вы перебирали элементы, находясь в doInBackground, вызывая publishProgress для каждого элемента, а затем выполняли обновления пользовательского интерфейса для элемента при получении обратного вызова в onProgressUpdate.

...