Android: раздувание макета занимает много времени
Нашел решение!
Теперь я использую 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();
}
Моя проблема заключается в том, что этот код работает довольно медленно, и процессный диалог останавливается примерно на 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;)
4 ответа
Похоже, вы строите список, вам, вероятно, стоит взглянуть на использование ListView, которое будет иметь преимущества только в том, что вам нужно будет только создать пользовательский интерфейс для количества отображаемых в данный момент строк, а также сделать повторное использование представления, чтобы Вам не нужно раздувать столько строк.
Нашел решение!
Теперь я использую ViewPager вместо ViewFlipper. Представления теперь генерируются в моем методе run() (который уже существует, потому что я получаю данные из Интернета) и сохраняются на карте. В моем обработчике я вызываю только pagerAdapter.notifyDataSetChanged(). PagerAdapter использует карту представлений, и он работает плавно и быстро. Так что теперь я ищу возможность бесконечной прокрутки ViewPager, но это еще одна проблема, не связанная с этим;)
Спасибо всем за ваши ответы и продолжайте оказывать хорошую поддержку.
Лучше пойти на Listview. Даже мы можем добавить более одного дизайна строк в просмотр списка оптимизированным способом, который улучшит производительность лучше.
Вы определенно можете сделать это на AsyncTask
, Хотя вы не можете обновить пользовательский интерфейс на doInBackground
метод AsyncTask, вы можете из onProgressUpdate
,
Я бы разбил код, чтобы вы перебирали элементы, находясь в doInBackground
, вызов publishProgress
для каждого элемента, а затем выполнить обновление пользовательского интерфейса для элемента, когда вы получаете обратный вызов в onProgressUpdate
,