3

找到解决方案!

我现在使用 ViewPager 而不是 ViewFlipper。视图现在在我的 run() 方法中生成(该方法已经存在,因为我从 Web 获取数据)并保存在地图中。在我的处理程序中,我只调用 pagerAdapter.notifyDataSetChanged(),pagerAdapter 使用视图地图,它运行流畅且快速。所以我现在正在寻找一个让 ViewPager 无限滚动的方法,但那是另一个与此无关的问题;)

感谢大家的回答,并保持良好的支持。

我对 Android 开发很陌生,并且在扩展(巨大的)布局时遇到了问题。我从一个工作正常的 Web 服务中获取了一些数据,然后我在我的 Activity 中使用一个处理程序将这些数据带到前端。这是我的句柄消息:

    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 个视图,其中包含一个包含 table 我认为问题是,android 开始绘制和计算布局的 relativeLayout (),这需要太长时间。如果我是正确的,我不能使用 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

4 回答 4

4

您似乎正在构建一个列表,您可能应该考虑使用 ListView,它的优点是只需要为当前显示的行数构建 UI,并且还可以重复使用视图,这样你不需要膨胀尽可能多的行。

于 2012-03-10T00:34:45.203 回答
2

找到解决方案!

我现在使用 ViewPager 而不是 ViewFlipper。视图现在在我的 run() 方法中生成(该方法已经存在,因为我从 Web 获取数据)并保存在地图中。在我的处理程序中,我只调用 pagerAdapter.notifyDataSetChanged(),pagerAdapter 使用视图地图,它运行流畅且快速。所以我现在正在寻找一个让 ViewPager 无限滚动的方法,但那是另一个与此无关的问题;)

感谢大家的回答,并保持良好的支持。

于 2012-03-10T16:16:12.023 回答
1

最好选择Listview。甚至我们可以以优化的方式在列表视图中添加多个行设计,这将更好地提高性能。

于 2012-03-10T03:55:23.627 回答
0

你绝对可以在AsyncTask. 虽然您无法在doInBackgroundAsyncTask 的方法上更新 UI,但您可以从onProgressUpdate.

我会分解代码,以便您在 中迭代项目doInBackground,调用publishProgress每个项目,然后在收到回调时为项目执行 UI 更新onProgressUpdate

于 2012-03-10T00:30:27.870 回答