Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确实现ProgressDialog,以便在后台调用耗时的方法?_Java_Android - Fatal编程技术网

Java 如何正确实现ProgressDialog,以便在后台调用耗时的方法?

Java 如何正确实现ProgressDialog,以便在后台调用耗时的方法?,java,android,Java,Android,我使用BaseAdapter来显示对象列表。这些对象是从服务器获取的。BaseAdapter的getView()方法如下所示: /* (non-Javadoc) * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup) */ @Override public View getView(int position, Vi

我使用BaseAdapter来显示对象列表。这些对象是从服务器获取的。BaseAdapter的getView()方法如下所示:

/* (non-Javadoc)
         * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LinearLayout content = (LinearLayout) View.inflate(lexs, R.layout.favorite_item, null);

            LinearLayout paragraphView = new LinearLayout(lexs); 
            paragraphView.setBackgroundColor(Color.RED);
            paragraphView.setGravity(Gravity.CENTER_VERTICAL);
            paragraphView.setOrientation(LinearLayout.HORIZONTAL);

            ImageView img = new ImageView(lexs);
            img.setImageResource(R.drawable.down);
            paragraphView.addView(img);
            img.setPadding(0, 0, 5, 0);
            img.setOnClickListener(new WorkspaceOnClickListener(position));

            TextView text = new TextView(lexs);
            text.setTextColor(Color.WHITE);
            text.setText(favorites.get(position).getParentChapter().getBook().getName() + ": §" + favorites.get(position).getName());
            text.setOnClickListener(new ParagraphOnClickListener(position));

            DisplayMetrics metrics = new DisplayMetrics();
            lexs.getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int maxWidth = metrics.widthPixels - 100;

            text.setMaxWidth(maxWidth);
            text.setMinWidth(maxWidth);
            paragraphView.addView(text);

            ImageView imgClose = new ImageView(lexs);
            imgClose.setMinimumHeight(30);
            imgClose.setMinimumWidth(30);
            imgClose.setImageResource(R.drawable.close);
            imgClose.setPadding(5, 0, 0, 0);
            paragraphView.addView(imgClose);
            imgClose.setOnClickListener(new CloseListener(position));

            content.addView(paragraphView);
            content.setPadding(0, 0, 0, 10);

            if (favorites.get(position).isExpanded()) {
                LinearLayout textLayer = new LinearLayout(lexs);
                textLayer.setBackgroundColor(Color.rgb(214, 214, 214));

                LinearLayout left = new LinearLayout(lexs);
                left.setOrientation(LinearLayout.VERTICAL);

                ImageView moveUp = new ImageView(lexs);
                moveUp.setImageResource(R.drawable.move_up);
                moveUp.setOnClickListener(new MoveListener(UP, position));
                moveUp.setPadding(0, 0, 0, 10);
                left.addView(moveUp);

                ImageView moveDown = new ImageView(lexs);
                moveDown.setImageResource(R.drawable.move_down);
                moveDown.setOnClickListener(new MoveListener(DOWN, position));
                left.addView(moveDown);

                TextView paragraphText = new TextView(lexs);
                paragraphText.setText(favorites.get(position).getText());
                paragraphText.setTextColor(Color.BLACK);

                LinearLayout right = new LinearLayout(lexs);
                right.setOrientation(LinearLayout.HORIZONTAL);
                right.addView(paragraphText);

                textLayer.addView(left);
                textLayer.addView(right);
                content.addView(textLayer);

                img.setImageResource(R.drawable.up);
            }

            return content;
        }

    }
所以我希望在后台调用整个方法,在执行该方法的过程中,会显示一个ProgresDialog。我用以下方式定义了ProgressDialog:

public class LoadingInformation {

    private static ProgressDialog progressDialog;

    public static void showProgressInformation(Context view) {

        progressDialog = ProgressDialog.show(view, "Please wait...", "Doing Extreme Calculations...", true);
        System.out.println("Start Loading Screen");

    }

    public static void stopShowingProgressInformation() {

        Handler handler=new Handler();
        handler.post(new Runnable(){public void run(){progressDialog.dismiss();}});
        System.out.println("Stop Loading Screen");

    }

}
但问题是,我不知道如何正确地实现这些调用。我尝试替换所有行:

adapter.notifyDataSetChanged();
使用以下代码:

public void updateFavoriteList() {

        LoadingInformation.showProgressInformation(lexs);

        new Thread() {

            public void run() {

                lexs.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        adapter.notifyDataSetChanged();
                        LoadingInformation.stopShowingProgressInformation();
                    }

                });



            }

            }.start();


    }
但不幸的是,这并没有达到预期效果。有人知道如何做得更好吗?

适配器的getView()方法不负责下载列表中的内容,它所做的只是构建当前行,该行显示在列表视图中getView()与从网络资源下载数据没有任何关系,而在网络资源中,您不需要使用ProgressDialog

当您实例化适配器(代码中未显示)时,您将传递希望BaseAdapter填充列表视图的数据。要么数据已经下载并简单地传递给适配器,要么适配器本身在构造函数中完成了下载

如果您不想更改列表视图的数据集,则必须创建一些setter方法,或者在适配器中有一个自动从网络刷新数据集的方法。但是,在任何情况下,这都是希望显示ProgressDialog的地方,而不是在getView()方法设置ListView行时

另一个建议是使用传递给getView()convertView参数。如果你有一个大的列表,它会大大提高列表的性能。查看Romain Guy在Google I/O 2009或2010年讲座中关于ListView的演示


编辑:

所以“偏好”是ListView的数据数组(或列表等)。您很可能通过构造函数参数将“收藏夹”数据传递给适配器。此时,数据已经存在于适配器中,或者您正在传递一个网络位置,以便适配器可以获取数据并在ListView中显示它

为了简单起见,假设您在将字符串数据传递给适配器之前将其下载到字符串数组中。每个元素都包含一个字符串,该字符串将通过TextView显示在ListView中。将该数组传递给适配器,它使用getView()方法中的逻辑为您处理ListView的格式设置

现在,当您下载数据以填充ListView时,您希望显示ProgressDialog以让用户知道发生了什么。正如一些人已经说过的,您将使用。AsyncTask将允许您在中实际下载数据并在中删除该对话框时通过显示ProgressDialog


我希望这是有意义的。

耗时的任务应该用异步任务来处理。 阅读


它已添加到Android框架中,以帮助您完成这些耗时的工作并更新进度对话框,而无需自己编写任务和处理程序的样板。

Hmm我不知道我是否正确理解您的意思。但在我的代码中,数据是从以下行中的服务器获取的:text.setText(favorites.get(position).getParentChapter().getBook().getName()+“:§“+favorites.get(position).getName());我知道这不是一个很好的方法,但现在我有这种方法。感谢您提供有关convertView的提示。一旦我知道如何使用它,我就会更改代码。请查看我对我的帖子所做的编辑。它太长,无法作为注释发布。请注意:确保在GUI线程上调用AsyncTask构造函数。