如何在做一些工作时在View上显示ProgressBar?

时间:2012-12-04 18:57:58

标签: android android-listview progress-bar

我有EditTextButtonListView的观点。 按钮onClick()解析一些网站(这部分工作正常),但是需要一些时间才能在ListView中显示解析后的信息,所以我想在地方显示小ProgressBar,其中ListView应该在一段时间后发生。

所以,我把它添加到我的布局中(我在这里写了重要部分):

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/layout1"
        android:weightSum="1.0">

        <EditText
            android:layout_width="0px"
            android:layout_height="wrap_content"
            android:layout_weight=".86" />

        <ImageButton
            android:layout_height="match_parent"
            android:layout_width="0px"
            android:layout_weight=".14" />

    </LinearLayout>

    <RelativeLayout 
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:layout_below="@id/layout1"
        android:gravity="center"
        android:layout_centerInParent="true"
        android:id="@+id/progressbar" >

        <ProgressBar 
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            style="@android:style/Widget.ProgressBar.Small" />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/layout1">

        <ListView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

    </RelativeLayout>

</RelativeLayout>

源代码:

progressBar = (RelativeLayout) findViewById(R.id.progressbar);

每次我想展示ProgressBar时,我都会这样做:

progressBar.setVisibility(View.VISIBLE);

禁用:

progressBar.setVisibility(View.INVISIBLE);

但这不起作用。

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:2)

无需操纵ProgressBar的可见度。 ListView有一项名为“空视图”的功能,仅当您的ListView为空时才会显示该功能。以下是使用它需要做的事情:

  1. 如果您的活动延长ListActivity,请使用 android:id="@android:id/list"ListView {。}} android:id="@android:id/empty"。{/ 1> ProgressBar
  2. 如果您不展开ListActivity,则会setEmptyView() ListView的方法,可以让你做同样的事情。
  3. 如果您不需要清空ListView,则上述方法最适合(例如,在活动启动时仅加载一次数据)。如果您之后需要设置数据,最好使用ViewSwitcher,这也有很大的优势 - 它允许您应用过渡动画。有关ViewSwitcher的详细信息,请查看this

答案 1 :(得分:1)

RelativeLayout ListView隐藏了ProgressBar。修改了这样的布局,看看它是怎么回事:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/layout1"
        android:weightSum="1.0">

        <EditText
            android:layout_width="0px"
            android:layout_height="wrap_content"
            android:layout_weight=".86" />

        <ImageButton
            android:layout_height="match_parent"
            android:layout_width="0px"
            android:layout_weight=".14" />

    </LinearLayout>

    <ListView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" android:layout_below="@id/layout1"/>

    <RelativeLayout 
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_centerInParent="true"
        android:id="@+id/progressbar" >

        <ProgressBar 
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            style="@android:style/Widget.ProgressBar.Small" />

    </RelativeLayout>   


</RelativeLayout>

同样看看at one of my answers,有点类似的问题。

答案 2 :(得分:1)

您无需将ProgressBar嵌套在另一个RelativeLayout中。只需将它置于主要布局中并将其放在最后,使其保持在顶部。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   // the rest  

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_centerInParent="true"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />   

</RelativeLayout>

答案 3 :(得分:0)

尝试使用如上所述的异步任务。

/**
 * this class performs all the work, shows dialog before the work and dismiss it after
 */
 public class ProgressTask extends AsyncTask<String, Void, Boolean> {

public ProgressTask(ListActivity activity) {
    this.activity = activity;
    dialog = new ProgressDialog(context);
}

/** progress dialog to show user that the backup is processing. */
private ProgressDialog dialog;
/** application context. */
private ListActivity activity;

protected void onPreExecute() {
    this.dialog.setMessage("Progress start");
    this.dialog.show();
}

    @Override
protected void onPostExecute(final Boolean success) {
    if (dialog.isShowing()) {
        dialog.dismiss();
    }


    //do whatever with your data
}

protected Boolean doInBackground(final String... args) {
   try{    
      //parsing of your website here...

      return true;
   } catch (Exception e)
      Log.e("tag", "error", e);
      return false;
   }
  }
}

答案 4 :(得分:0)

对于那些对答案感兴趣的人。

仅写入主要标签。

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/layout1"
        android:weightSum="1.0" >

        <EditText
            android:layout_width="0px"
            android:layout_height="wrap_content"
            android:layout_weight=".86" />

        <ImageButton
            android:layout_height="match_parent"
            android:layout_width="0px"
            android:layout_weight=".14" />

    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/layout1" >

        <ListView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/layout1" />

    </RelativeLayout>

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/layout1"
        android:gravity="center"
        android:visibility="gone"
        android:background="#DDE7E7E8"
        android:id="@+id/pBar" >

        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@android:style/Widget.ProgressBar.Small"  />

    </LinearLayout>

</RelativeLayout>

AsyncTask

private class Parsing extends AsyncTask<Void, Void, Void>
{
    private LinearLayout pBar; 

    private Parsing()
    {
        pBar = (LinearLayout) findViewById(R.id.pBar);
    }

    @Override
    protected Void doInBackground(Void... params) 
    {
        parsingHere();
        return null;
    }

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
        pBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected void onPostExecute(Void result) 
    {
        super.onPostExecute(result);
        pBar.setVisibility(View.INVISIBLE);
    }

}