Java 如何正确实现ProgressDialog,以便在后台调用耗时的方法?
我使用BaseAdapter来显示对象列表。这些对象是从服务器获取的。BaseAdapter的getView()方法如下所示: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
/* (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构造函数。