Использование «анимированного круга» в ImageView при загрузке материала

В настоящее время я использую в своем приложении список, который может отображаться на одну секунду.

В настоящее время я использую свойство @ id / android: empty списка listview для создания «загружаемого» текста.

 

Теперь я хотел бы заменить это анимированным кругом, который используется в диалоговом окне загрузки вместо этого текста, я думаю, вы все знаете, что я имею в виду:

Изменить: мне не нужен диалог. Я хочу показать это внутри моего макета.

http://flexfwd.com/DesktopModules/ATI_Base/resources/images/loading_blue_circle.gif

Большое спасибо за вашу помощь!

Просто поместите этот блок xml в файл макета активности:

    

И когда вы закончите загрузку, вызовите эту строку:

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

Результат (и он тоже вращается):

введите описание изображения здесь

Вы можете сделать это, используя следующий xml

    

С этим стилем

   

Чтобы использовать это, вы должны скрыть свои элементы пользовательского интерфейса, установив значение видимости в GONE и всякий раз, когда данные загружены, вызовите setVisibility(View.VISIBLE) для всех ваших просмотров, чтобы восстановить их. Не забудьте вызвать findViewById(R.id.loadingPanel).setVisiblity(View.GONE) чтобы скрыть анимацию загрузки.

Если у вас нет загрузочного события / функции, но просто нужно, чтобы панель загрузки исчезла через x секунд, используйте ручку, чтобы вызвать скрытие / показ.

Это обычно называют неопределенным индикатором прогресса или неопределенным диалогом прогресса.

Объедините это с streamом и обработчиком, чтобы получить именно то, что вы хотите. Существует несколько примеров того, как это сделать через Google или прямо здесь, на SO. Я очень рекомендую потратить время, чтобы узнать, как использовать эту комбинацию classов для выполнения такой задачи. Это невероятно полезно для многих типов приложений и даст вам представление о том, как Threads and Handlers могут работать вместе.

Я расскажу вам, как это работает:

Событие загрузки запускает диалог:

 //maybe in onCreate showDialog(MY_LOADING_DIALOG); fooThread = new FooThread(handler); fooThread.start(); 

Теперь stream выполняет работу:

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

Наконец, верните состояние из streamа, когда оно будет завершено:

 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. Создайте ProgressBar в том же XML-макете списка.
  2. Сделайте его центрированным
  3. Дайте ему идентификатор
  4. Прикрепите его к переменной экземпляра listview, вызвав setEmptyView

Android будет следить за видимостью индикатора выполнения.

Например, в activity_main.xml :

       

И в 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 call; List 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() { @Override public void onResponse(Call call, Response 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 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 call, Throwable t) { } }); } 

}

Вы можете использовать этот код из образцов github firebase .

Вам не нужно редактировать файлы макетов … просто создайте новый class «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(); 

Для тех, кто развивается в Котлине, есть сладкий метод, предоставляемый библиотекой Anko, что делает процесс отображения ProgressDialog ветерок!

Основываясь на этой ссылке:

 val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data") dialog.show() //.... dialog.dismiss() 

На этом отобразится диалоговое окно «Прогресс» с отображением прогресса% (для которого вы должны передать параметр init также для расчета прогресса).

Существует также метод indeterminateProgressDialog() , который обеспечивает анимацию Spinning Circle неограниченно до тех пор, пока не будет отклонен:

 indeterminateProgressDialog("Loading...").show() 

Кричите этот блог, который привел меня к этому решению.

Давайте будем гением компьютера.