我有EditText
,Button
和ListView
的观点。
按钮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);
但这不起作用。
我该如何解决这个问题?
答案 0 :(得分:2)
无需操纵ProgressBar
的可见度。 ListView
有一项名为“空视图”的功能,仅当您的ListView
为空时才会显示该功能。以下是使用它需要做的事情:
ListActivity
,请使用
android:id="@android:id/list"
和ListView
{。}}
android:id="@android:id/empty"
。{/ 1> ProgressBar
ListActivity
,则会setEmptyView()
ListView
的方法,可以让你做同样的事情。如果您不需要清空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);
}
}