233 votes

Utilisation du "cercle animé" dans une ImageView lors du chargement de matériel

J'utilise actuellement dans mon application une vue de liste qui a besoin d'une seconde pour être affichée.

Ce que je fais actuellement, c'est utiliser la propriété @id/Android:empty du listview pour créer un texte de "chargement".

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

Maintenant, je voudrais remplacer ce texte par le cercle animé qui est utilisé dans une boîte de dialogue de chargement, je suppose que vous voyez tous ce que je veux dire :

Edit : Je ne veux pas de dialogue. Je veux l'afficher dans ma mise en page.

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

Merci beaucoup pour votre aide !

1voto

Md_Zubair Ahmed Points 119

Si vous souhaitez ne pas gonfler une autre vue juste pour indiquer la progression, procédez comme suit :

  1. Créez la barre de progression dans le même format XML que la vue en liste.
  2. Faites-le centrer
  3. Donnez-lui un identifiant
  4. Attachez-le à votre variable d'instance listview en appelant setEmptyView

Android se chargera de la visibilité de la barre de progression.

Par exemple, dans 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>

Et dans 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) {

        }
    });

}

}

0 votes

La barre de progression doit se trouver au deuxième emplacement dans le RelativeLayout, sinon elle sera rendue derrière la vue située au deuxième emplacement (une ImageView dans mon cas et une ListView dans le vôtre).

1voto

DarkCygnus Points 3048

Pour ceux qui développent en Kotlin, il y a une méthode douce fournie par l'Anko qui rend le processus d'affichage d'un ProgressDialog une brise !

Sur la base de ce lien :

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

Cela affichera une boîte de dialogue de progression avec le % de progression affiché (pour lequel vous devez passer le paramètre init également pour calculer la progression).

Il y a aussi le indeterminateProgressDialog() qui fournit l'animation Spinning Circle indéfiniment jusqu'à ce qu'elle soit annulée :

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

Un grand bravo à ce blog ce qui m'a conduit à cette solution.

0 votes

Cela aurait pu être une bonne réponse mais maintenant le paquet n'est plus maintenu : github.com/Kotlin/anko/blob/master/GOODBYE.md

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X