我目前在我的应用程序中使用一个列表视图,可能需要一秒钟才能显示。
我目前做的是使用listview的@id/android:empty属性来创建一个“加载”文本。
<TextView android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000"
android:text="Loading..."/>
现在,我想用加载对话框中使用的动画圈代替这段文字,我猜你们都知道我的意思:
编辑:我不想要对话框。我想在布局中展示一下。
非常感谢你的帮助!
这通常被称为不确定进度条或不确定进度对话框。
将它与线程和处理程序结合起来,就可以得到你想要的东西。有很多例子是关于如何通过谷歌或这里的SO来做到这一点。我强烈建议花时间学习如何使用类的组合来执行这样的任务。它在许多类型的应用程序中都非常有用,并将让您深入了解线程和处理程序如何协同工作。
我会告诉你这是如何运作的:
加载事件启动对话框:
//maybe in onCreate
showDialog(MY_LOADING_DIALOG);
fooThread = new FooThread(handler);
fooThread.start();
现在线程开始工作:
private class FooThread extends Thread {
Handler mHandler;
FooThread(Handler h) {
mHandler = h;
}
public void run() {
//Do all my work here....you might need a loop for this
Message msg = mHandler.obtainMessage();
Bundle b = new Bundle();
b.putInt("state", 1);
msg.setData(b);
mHandler.sendMessage(msg);
}
}
最后,当线程完成时,从线程中取回状态:
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
int state = msg.getData().getInt("state");
if (state == 1){
dismissDialog(MY_LOADING_DIALOG);
removeDialog(MY_LOADING_DIALOG);
}
}
};
您可以通过使用下面的xml来做到这一点
<RelativeLayout
style="@style/GenericProgressBackground"
android:id="@+id/loadingPanel"
>
<ProgressBar
style="@style/GenericProgressIndicator"/>
</RelativeLayout>
这种风格
<style name="GenericProgressBackground" parent="android:Theme">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:background">#DD111111</item>
<item name="android:gravity">center</item>
</style>
<style name="GenericProgressIndicator" parent="@android:style/Widget.ProgressBar.Small">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:indeterminate">true</item>
</style>
要使用这个,你必须通过设置可见性值为GONE来隐藏你的UI元素,无论何时数据被加载,在你所有的视图上调用setVisibility(View.VISIBLE)来恢复它们。不要忘记调用findViewById(R.id.loadingPanel). setvisibility (View.GONE)来隐藏加载动画。
如果你没有加载事件/函数,只是想要加载面板在x秒后消失,使用句柄来触发隐藏/显示。
如果你不想仅仅为了显示进度而膨胀另一个视图,那么执行以下操作:
在列表视图的相同XML布局中创建ProgressBar。
让它居中
给它一个id
通过调用setEmptyView将它附加到你的listview实例变量
Android会注意进度条的可见性。
例如,在activity_main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<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"
android:orientation="vertical"
tools:context="com.fcchyd.linkletandroid.MainActivity">
<ListView
android:id="@+id/list_view_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/colorDivider"
android:dividerHeight="1dp" />
<ProgressBar
android:id="@+id/loading_progress_xml"
style="?android:attr/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</RelativeLayout>
在mainactivity。java中:
package com.fcchyd.linkletandroid;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
final String debugLogHeader = "Linklet Debug Message";
Call<Links> call;
List<Link> arraylistLink;
ListView linksListV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linksListV = (ListView) findViewById(R.id.list_view_xml);
linksListV.setEmptyView(findViewById(R.id.loading_progress_xml));
arraylistLink = new ArrayList<>();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.links.linklet.ml")
.addConverterFactory(GsonConverterFactory
.create())
.build();
HttpsInterface HttpsInterface = retrofit
.create(HttpsInterface.class);
call = HttpsInterface.httpGETpageNumber(1);
call.enqueue(new Callback<Links>() {
@Override
public void onResponse(Call<Links> call, Response<Links> response) {
try {
arraylistLink = response.body().getLinks();
String[] simpletTitlesArray = new String[arraylistLink.size()];
for (int i = 0; i < simpletTitlesArray.length; i++) {
simpletTitlesArray[i] = arraylistLink.get(i).getTitle();
}
ArrayAdapter<String> simpleAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, simpletTitlesArray);
linksListV.setAdapter(simpleAdapter);
} catch (Exception e) {
Log.e("erro", "" + e);
}
}
@Override
public void onFailure(Call<Links> call, Throwable t) {
}
});
}
}
你可以使用这个代码从firebase github样本..
你不需要在布局文件中编辑…新建一个类BaseActivity
package com.example;
import android.app.ProgressDialog;
import android.support.annotation.VisibleForTesting;
import android.support.v7.app.AppCompatActivity;
public class BaseActivity extends AppCompatActivity {
@VisibleForTesting
public ProgressDialog mProgressDialog;
public void showProgressDialog() {
if (mProgressDialog == null) {
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Loading ...");
mProgressDialog.setIndeterminate(true);
}
mProgressDialog.show();
}
public void hideProgressDialog() {
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
}
@Override
public void onStop() {
super.onStop();
hideProgressDialog();
}
}
在您想要使用进度对话框的活动中。
public class MyActivity extends BaseActivity
之前/之后的功能,需要时间
showProgressDialog();
.... my code that take some time
showProgressDialog();
对于那些在Kotlin中开发的,有一个由Anko库提供的甜蜜方法,使显示ProgressDialog的过程变得轻而易举!
基于这个链接:
val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data")
dialog.show()
//....
dialog.dismiss()
这将显示一个显示进度%的进度对话框(为此,您必须传递init参数来计算进度)。
还有indeterminateProgressDialog()方法,它无限期地提供旋转的圆圈动画,直到被驳回:
indeterminateProgressDialog("Loading...").show()
大声喊出这个博客,它让我找到了这个解决方案。