找到解决方案!
我现在使用ViewPager而不是ViewFlipper。 视图现在在我的run()方法中生成(已经存在,因为我从Web获取数据)并保存在Map中。 在我的处理程序中,我只调用pagerAdapter.notifyDataSetChanged(),pagerAdapter使用视图Map,它可以平滑而快速地工作。 所以我现在正在寻找一个让ViewPager滚动无穷无尽的东西,但那是另一个与此无关的问题;)
感谢大家的回答并保持良好的支持。
我对Android开发很陌生,并且在膨胀(巨大)布局时遇到问题。 我从Web服务获取一些数据,然后我在我的Activity中使用一个处理程序将这些数据带到前端。这是我的handleMessage:
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();
}
我的问题是这段代码运行得非常慢,并且在它消失并显示布局之前,processdialog会冻结大约1秒钟。 游戏由34个条目组成,其中包含9个条目。 所以我添加了34个视图,其中包含一个包含表格的relativeLayout() 我认为问题是,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;)
答案 0 :(得分:4)
您似乎正在构建一个列表,您应该看一下使用ListView,它的优点是只需要为当前显示的行数构建UI,并且还可以查看重用,这样你就不需要膨胀尽可能多的行。
答案 1 :(得分:2)
找到解决方案!
我现在使用ViewPager而不是ViewFlipper。视图现在在我的run()方法中生成(已经存在,因为我从Web获取数据)并保存在Map中。在我的处理程序中,我只调用pagerAdapter.notifyDataSetChanged(),pagerAdapter使用视图Map,它可以平滑而快速地工作。所以我现在正在寻找一个让ViewPager滚动无穷无尽的东西,但那是另一个与此无关的问题;)
感谢大家的回答并保持良好的支持。
答案 2 :(得分:1)
最好去Listview。即使我们可以以优化的方式在列表视图中添加多个行设计,这将更好地提高性能。
答案 3 :(得分:0)
你绝对可以在AsyncTask
上执行此操作。虽然您无法在AsyncTask的doInBackground
方法上更新UI,但您可以从onProgressUpdate
更新。
我会分解代码,以便您在doInBackground
中迭代项目,为每个项目调用publishProgress
,然后在{{{{}}中获取回调时对项目执行UI更新1}}。