在加载内容时使用ImageView中的“animation圈”

我目前在我的应用程序中使用一个列表视图,需要一秒钟才能显示。

我目前所做的是使用列表视图的@ id / android:empty属性来创build一个“加载”文本。

<TextView android:id="@id/android:empty" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FF0000" android:text="Loading..."/> 

现在,我想用在加载对话框中使用的animation圆而不是这个文本replace它,我想你们都知道我的意思:

编辑:我不想要一个对话框。 我想显示在我的布局。

http://flexfwd.com/DesktopModules/ATI_Base/resourceshttp://img.dovov.comloading_blue_circle.gif

非常感谢您的帮助!

简单地把这个xml块放到你的activity布局文件中:

 <RelativeLayout android:id="@+id/loadingPanel" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminate="true" /> </RelativeLayout> 

而当你完成加载,请拨打这一行:

 findViewById(R.id.loadingPanel).setVisibility(View.GONE); 

结果(它也旋转):

在这里输入图像说明

你可以通过使用下面的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,并且每当数据被加载时,在所有的视图上调用setVisibility(View.VISIBLE)来恢复它们。 不要忘记调用findViewById(R.id.loadingPanel).setVisiblity(View.GONE)来隐藏加载animation。

如果您没有加载事件/function,但希望加载面板在x秒后消失,请使用“ 句柄”来触发隐藏/显示。

这通常被称为不确定进度条或不确定进度对话框。

结合这个线程和处理程序来得到你想要的。 有很多关于如何通过Google或者在SO上这样做的例子。 我强烈build议花时间学习如何使用这种类的组合来执行这样的任务。 它在许多types的应用程序中都是非常有用的,并且会让您对线程和处理程序如何一起工作有深入的了解。

我会让你开始如何工作:

加载事件启动对话框:

 //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); } } }; 

如果您不想膨胀另一个视图来指示进度,请执行以下操作:

  1. 在列表视图的同一个XML布局中创buildProgressBar。
  2. 使其居中
  3. 给它一个ID
  4. 通过调用setEmptyView将它附加到你的listview实例variables

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) { } }); } 

}