web-dev-qa-db-fra.com

comment afficher la barre de progression (cercle) dans une activité ayant une vue en liste avant de charger la vue en liste avec des données

J'ai un ListView dans mon deuxième activity.OnItemClick, j'ai appelé un service Web et j'essayais d'extraire des données. Et après cela, je passe à la troisième activité qui a aussi un ListView ayant une description des activités précédentes ListView item.

Je souhaite afficher une boîte de dialogue de progression avant de renseigner cette ListView.

Je ne comprends pas comment le faire sur ListView? Est-ce que quelqu'un sait comment le faire?

Mon code

Troisième activité.Java

   package com.google.iprotect;

import Java.io.IOException;
import Java.util.ArrayList;
import Java.util.HashMap;
import Java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParserException;

import com.google.iprotect.layout.TitleBarLayout;

import Android.app.Activity;
import Android.app.ListActivity;
import Android.app.ProgressDialog;
import Android.content.Intent;
import Android.content.res.ColorStateList;
import Android.content.res.XmlResourceParser;
import Android.os.AsyncTask;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.AdapterView;
import Android.widget.LinearLayout;
import Android.widget.ListView;
import Android.widget.ProgressBar;
import Android.widget.AdapterView.OnItemClickListener;
import Android.widget.TextView;

public class ThirdActivity extends ListActivity implements OnItemClickListener{

    JSONArray jArray1,jArray2;
    String one,two,three,tablename;
    String color,r;
    JSONObject responseJSON;
    TitleBarLayout titlebarLayout;
    final ArrayList<Tables> arraylist = new ArrayList<Tables>();
    TextView tableName;
    ColorStateList colorStateList1;
    String email1,password1;
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.thirdactivity);

        ListView lv=getListView();
        lv.setOnItemClickListener(this);


        tablename=getIntent().getExtras().getString("Table Name");
        email1 = getIntent().getExtras().getString("email");
        password1 =getIntent().getExtras().getString("password");

        titlebarLayout = new TitleBarLayout(ThirdActivity.this);
        titlebarLayout.setLeftButtonText("go Back");
        titlebarLayout.setRightButtonText("Logout");
        titlebarLayout.setTitle(tablename);
        titlebarLayout.setLeftButtonSize(70,40);
        titlebarLayout.setRightButtonSize(70,40);
        //titlebarLayout.setLeftButtonLeftDrawable(R.drawable.refresh);

        //titlebarLayout.setRightButtonLeftDrawable(R.drawable.buttonrefresh);
        //titlebarLayout.setLeftButtonBackgroundColor(Color.rgb(255,255,255));
        //titlebarLayout.setRightButtonBackgroundColor(Color.rgb(34,49,64));
        //titlebarLayout.setLeftButtonTextColor(Color.rgb(255,255,255));
        //titlebarLayout.setRightButtonTextColor(Color.rgb(255,255,0));     

        XmlResourceParser parser1 =getResources().getXml(R.color.colorstatelist);


        try {
            colorStateList1 = ColorStateList.createFromXml(getResources(), parser1);
            titlebarLayout.setRightButtonTextColor(colorStateList1);
        } catch (XmlPullParserException e) {    
            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }

        OnClickListener listener = new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (v.getId() == R.id.left_button) {
                    Intent intent = new Intent(ThirdActivity.this,SecondActivity.class);
                    intent.putExtra("email", email1);
                    intent.putExtra("password", password1);
                    startActivity(intent);
                    finish();

                } else if (v.getId() == R.id.right_button) {
                    Intent intent = new Intent(ThirdActivity.this,
                            MainActivity.class);
                    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                    ThirdActivity.this.startActivity(intent);

                }
            }
        };
        titlebarLayout.setLeftButtonOnClickListener(listener);
        titlebarLayout.setRightButtonOnClickListener(listener);


        updateTableList();




    }

    private void updateTableList() {
        // TODO Auto-generated method stub
        //final ProgressDialog pd1=ProgressDialog.show(this, "Calling Webservice", "Waiting...", true, false);

        final ProgressBar pbHeaderProgress = (ProgressBar) findViewById(R.id.pbHeaderProgress);

        new AsyncTask<Void, Void, Void>() {


            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
                pbHeaderProgress.setVisibility(View.VISIBLE);
            }



            protected Void doInBackground(Void... params) {
                r = invokeWebService1(tablename);
                //pd1.dismiss();

                try {
                    responseJSON = new JSONObject(r);
                    //json reading
                    jArray1 = responseJSON.getJSONArray("FirstThree");//get JSONArray jArray1 from JSONObject with name FirstThree
                    jArray2 = responseJSON.getJSONArray("Color");//get JSONArray jArray2 from JSONOobject with name Color
                    JSONObject json_data1 = null;
                    JSONObject json_data2 = null;

                    for (int i = 0; i < jArray1.length(); i++) {
                        json_data1 = jArray1.getJSONObject(i);//get JSONObject json_data1 from JSONArray at index i;
                        one = json_data1.getString("One");//get value from JSONObject json_data1 with key "One"
                        two = json_data1.getString("Two");
                        three = json_data1.getString("Three");
                        json_data2 = jArray2.getJSONObject(i);
                        color = json_data2.getString("color");//get value from JSONObject json_data2 with key "color"

                        Tables tables = new Tables();
                        //set value to Tables Class
                        tables.column1 = one;
                        tables.column2 = two;
                        tables.column3 = three;
                        tables.tableName=tablename;
                        tables.color=color;
                        //add Tables object into ArrayList<Tables>
                        arraylist.add(tables);

                        Log.i("ONE", json_data1.getString("One"));
                        Log.i("TWO", json_data1.getString("Two"));
                        Log.i("THREE", json_data1.getString("Three"));
                        Log.i("color",""+ json_data2.getString("color"));
                    }

                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }

            protected void onPostExecute(Void result) {
                pbHeaderProgress.setVisibility(View.GONE);

                //Custom Adapter for ListView
                TableDetailAdapter adaptor = new TableDetailAdapter(ThirdActivity.this,
                        R.layout.table_data_list_item, arraylist);
                setListAdapter(adaptor);
            }
        }.execute();

    }

    protected String invokeWebService1(String tablename2) {
        // TODO Auto-generated method stub
        String response = "";
        try {
            WebService webService = new WebService(
            "http://sphinx-solution.com/iProtect/api.php?");

            // Pass the parameters if needed
            Map<String, String> params = new HashMap<String, String>();
            params.put("action", "getTableRecords");
            params.put("tablename", tablename2);
            params.put("email", email1);
            params.put("password", password1);

            // Get JSON response from server the "" are where the method name
            // would normally go if needed example
            response = webService.WebGet("auth", params);

        } catch (Exception e) {
            Log.d("Error: ", e.getMessage());
        }
        return response;
    }


    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        // TODO Auto-generated method stub

        Log.v("", "Click ListItem Number "+position);
        Intent intent = new Intent(ThirdActivity.this,FourthActivity.class);
        intent.putExtra("Json", responseJSON.toString());//sending json Object as a string to next activity
        intent.putExtra("Table Name", tablename);
        intent.putExtra("email", email1);
        intent.putExtra("password", password1);
        intent.putExtra("Item No", position);
        startActivity(intent);

    }

}

thirdactivity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/linlaHeaderProgress"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    tools:context=".ThirdActivity" >

    <include
        Android:id="@+id/titlebar"
        layout="@layout/titlebar_layout" />

    <ProgressBar
        Android:id="@+id/pbHeaderProgress"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:layout_weight="2" >
    </ProgressBar>

    <ListView
        Android:id="@Android:id/list"
        Android:layout_width="match_parent"
        Android:layout_height="260dp" 
        Android:layout_weight="5.04">
    </ListView>

    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="@dimen/titlebar_height"
        Android:layout_alignParentBottom="true"
        Android:background="@color/footer_bg_color"
        Android:gravity="bottom"
        Android:orientation="horizontal" >

        <include
            Android:id="@+id/footer"
            Android:layout_height="@dimen/titlebar_height"
            Android:layout_gravity="bottom|center_horizontal"
            layout="@layout/footer_layout" />
    </LinearLayout>

</LinearLayout>
136
Ani

Il existe plusieurs méthodes pour afficher une barre de progression (cercle) lors du chargement d'une activity. Dans votre cas, un avec une ListView dedans.

EN ACTIONBAR

Si vous utilisez une ActionBar, vous pouvez appeler la ProgressBar comme ceci (ceci pourrait aller dans votre onCreate()

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);  
setProgressBarIndeterminateVisibility(true);

Et après avoir affiché la liste, masquez-la.

setProgressBarIndeterminateVisibility(false);

DANS LA DISPOSITION (Le XML)

<LinearLayout
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_weight="1"
    Android:orientation="vertical" >

    <LinearLayout
        Android:id="@+id/linlaHeaderProgress"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:gravity="center"
        Android:orientation="vertical"
        Android:visibility="gone" >

        <ProgressBar
            Android:id="@+id/pbHeaderProgress"
            style="@style/Spinner"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content" >
        </ProgressBar>
    </LinearLayout>

    <ListView
        Android:id="@+id/list"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:layout_weight="1"
        Android:cacheColorHint="@Android:color/transparent"
        Android:divider="#00000000"
        Android:dividerHeight="0dp"
        Android:fadingEdge="none"
        Android:persistentDrawingCache="scrolling"
        Android:smoothScrollbar="false" >
    </ListView>
</LinearLayout>

Et dans votre activité (Java) .__, j’utilise une AsyncTask pour récupérer les données de mes listes. SO, dans la onPreExecute() de la AsyncTask, j'utilise quelque chose comme ceci:

// CAST THE LINEARLAYOUT HOLDING THE MAIN PROGRESS (SPINNER)
LinearLayout linlaHeaderProgress = (LinearLayout) findViewById(R.id.linlaHeaderProgress);

@Override
protected void onPreExecute() {    
    // SHOW THE SPINNER WHILE LOADING FEEDS
    linlaHeaderProgress.setVisibility(View.VISIBLE);
}

et dans onPostExecute(), après avoir défini l'adaptateur sur ListView:

@Override
protected void onPostExecute(Void result) {     
    // SET THE ADAPTER TO THE LISTVIEW
    lv.setAdapter(adapter);

    // CHANGE THE LOADINGMORE STATUS TO PERMIT FETCHING MORE DATA
    loadingMore = false;

    // HIDE THE SPINNER AFTER LOADING FEEDS
    linlaHeaderProgress.setVisibility(View.GONE);
}

EDIT: voici à quoi cela ressemble dans mon application lors du chargement de plusieurs ListViews

enter image description here

170
Siddharth Lele

Vous pouvez faire cela plus facilement.
Source: http://www.tutorialspoint.com/Android/android_loading_spinner.htm
Ça m'a aidé.

Disposition:

<ProgressBar
   Android:id="@+id/progressBar1"
   style="?android:attr/progressBarStyleLarge"
   Android:layout_width="wrap_content"
   Android:layout_height="wrap_content"
   Android:layout_centerHorizontal="true" />

Après l'avoir défini en XML, vous devez obtenir sa référence dans un fichier Java à travers la classe ProgressBar. Sa syntaxe est donnée ci-dessous:

private ProgressBar spinner;
spinner = (ProgressBar)findViewById(R.id.progressBar1);

Après cela, vous pouvez le faire disparaître et le rapporter au besoin via la méthode setVisibility. Sa syntaxe est donnée ci-dessous:

spinner.setVisibility(View.GONE);
spinner.setVisibility(View.VISIBLE);
28
Sergey Kuchin

J'ai utilisé celui-ci pour le chargement de vue liste peut être utile.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:paddingLeft="5dp"
Android:paddingRight="5dp" >

<LinearLayout
    Android:id="@+id/progressbar_view"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:gravity="center_horizontal"
    Android:orientation="vertical" >

    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center_horizontal"
        Android:orientation="horizontal" >

        <ProgressBar
            style="?android:attr/progressBarStyle"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center_vertical|center_horizontal" />

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center_vertical|center_horizontal"
            Android:text="Loading data..." />
    </LinearLayout>

    <View
        Android:layout_width="fill_parent"
        Android:layout_height="1dp"
        Android:background="#C0C0C0" />
</LinearLayout>

<ListView
    Android:id="@+id/listView"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentTop="true"
    Android:layout_marginTop="1dip"
    Android:visibility="gone" />

</RelativeLayout>

et ma classe MainActivity est,

public class MainActivity extends Activity {
ListView listView;
LinearLayout layout;
List<String> stringValues;
ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView = (ListView) findViewById(R.id.listView);
    layout = (LinearLayout) findViewById(R.id.progressbar_view);

    stringValues = new ArrayList<String>();

    adapter = new ArrayAdapter<String>(this,
            Android.R.layout.simple_list_item_1, stringValues);

    listView.setAdapter(adapter);
    new Task().execute();
}

class Task extends AsyncTask<String, Integer, Boolean> {
    @Override
    protected void onPreExecute() {
        layout.setVisibility(View.VISIBLE);
        listView.setVisibility(View.GONE);
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Boolean result) {
        layout.setVisibility(View.GONE);
        listView.setVisibility(View.VISIBLE);
        adapter.notifyDataSetChanged();
        super.onPostExecute(result);
    }

    @Override
    protected Boolean doInBackground(String... params) {
        stringValues.add("String 1");
        stringValues.add("String 2");
        stringValues.add("String 3");
        stringValues.add("String 4");
        stringValues.add("String 5");

        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
}

cette activité affiche la progression pendant 3 secondes puis affiche listview, au lieu d’ajouter des données statiquement à la liste stringValues, vous pouvez obtenir des données du serveur dans doInBackground () et les afficher.

19
Srinivas Rampelli

Veuillez utiliser l'exemple sur tutorialspoint.com . Toute l’implémentation n’a besoin que de quelques lignes de code sans changer votre fichier XML. J'espère que cela t'aides.

ÉTAPE 1: Importer une bibliothèque

import Android.app.ProgressDialog;

ÉTAPE 2: Déclarer la variable globale ProgressDialog

ProgressDialog loading = null;

ÉTAPE 3: démarrez le nouveau ProgressDialog et utilisez les propriétés suivantes (veuillez noter que cet exemple ne couvre que la barre de chargement circulaire de base, sans statut de progression en temps réel).

loading = new ProgressDialog(v.getContext());
loading.setCancelable(true);
loading.setMessage(Constant.Message.AuthenticatingUser);
loading.setProgressStyle(ProgressDialog.STYLE_SPINNER);

ÉTAPE 4: Si vous utilisez AsyncTasks, vous pouvez commencer à afficher la boîte de dialogue dans la méthode onPreExecute. Sinon, il suffit de placer le code au début de votre événement bouton onClick.

loading.show();

ÉTAPE 5: Si vous utilisez AsyncTasks, vous pouvez fermer la boîte de dialogue de progression en plaçant le code dans la méthode onPostExecute. Sinon, il vous suffit de placer le code avant de fermer votre événement bouton onClick.

loading.dismiss();

Testé avec mon Nexus 5 Android v4.0.3. Bonne chance!

9
Chong Chern Dong

Étendez-vous ListActivity?

Si c'est le cas, placez une boîte de dialogue de progression circulaire avec la ligne suivante dans votre code xml

<ProgressBar
Android:id="@Android:id/empty"
...other stuff...
/>

Maintenant, l'indicateur de progression s'affichera jusqu'à ce que vous ayez toutes les informations de votre liste, et définissez l'adaptateur. A ce stade, la vue liste sera rétablie et la barre de progression disparaîtra.

8
The Holo Dev
ProgressDialog dialog = ProgressDialog.show(Example.this, "", "Loading...", true);
3
Neel Kadia

Créez un fichier xml n’importe quel nom (par exemple, progressBar.xml) dans drawable et ajoutez <color name="silverGrey">#C0C0C0</color> dans color.xml.

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:fromDegrees="0"
    Android:pivotX="50%"
    Android:pivotY="50%"
    Android:toDegrees="720" >

    <shape
        Android:innerRadiusRatio="3"
        Android:shape="ring"
        Android:thicknessRatio="6"
        Android:useLevel="false" >
        <size
            Android:height="200dip"
            Android:width="300dip" />

        <gradient
            Android:angle="0"
            Android:endColor="@color/silverGrey"
            Android:startColor="@Android:color/transparent"
            Android:type="sweep"
            Android:useLevel="false" />

    </shape>
</rotate>

Maintenant, dans votre fichier XML où vous avez votre liste, ajoutez ce code:

 <ListView
            Android:id="@+id/list_form_statusMain"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content">
        </ListView>

        <ProgressBar
            Android:id="@+id/progressBar"
            style="@style/CustomAlertDialogStyle"
            Android:layout_width="60dp"
            Android:layout_height="60dp"
            Android:layout_centerInParent="true"
            Android:layout_gravity="center_horizontal"
            Android:indeterminate="true"
            Android:indeterminateDrawable="@drawable/circularprogress"
            Android:visibility="gone"
            Android:layout_centerHorizontal="true"
            Android:layout_centerVertical="true"/>

En AsyncTask dans la méthode:

@Override
protected void onPreExecute()
{
    progressbar_view.setVisibility(View.VISIBLE);

    // your code
}

Et dans onPostExecute:

@Override
protected void onPostExecute(String s)
{
    progressbar_view.setVisibility(View.GONE);

    //your code
}
1
Vaibhav Joshi

Utilisez ce bouton dans l'option de clic ou vos besoins:

final ProgressDialog progressDialog;
progressDialog = new ProgressDialog(getApplicationContext());
progressDialog.setMessage("Loading..."); // Setting Message
progressDialog.setTitle("ProgressDialog"); // Setting Title
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // Progress Dialog Style Spinner
progressDialog.show(); // Display Progress Dialog
progressDialog.setCancelable(false);
new Thread(new Runnable() {
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        progressDialog.dismiss();
    }
}).start();
0
Mr Saykat

Lorsque vous travaillez avec listview ou recyclerview, je vous suggère d’utiliser SwipeRefreshLayout. Comme ça 

    <Android.support.v4.widget.SwipeRefreshLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/swiperefresh"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

        <Android.support.v7.widget.RecyclerView
            Android:id="@+id/card_recycler_view"
            Android:scrollbars="vertical"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"/>

</Android.support.v4.widget.SwipeRefreshLayout>

N'enroulez que votre vue et cela créera une animation d'actualisation lors du chargement de données ou en glissant l'écran vers le bas, comme nous pouvons le faire dans de nombreuses applications.
Voici la documentation pour l’utiliser:
https://developer.Android.com/training/swipe/add-swipe-interface.htmlhttps://developer.Android.com/training/swipe/respond-refresh -request.html

Bonne codage!

0
Gian Gomen

Vous pouvez ajouter la ProgressBar au listview footer:

private ListView listview;
private ProgressBar progressBar;

...

progressBar = (ProgressBar) LayoutInflater.from(this).inflate(R.layout.progress_bar, null);

listview.addFooterView(progressBar);

layout/progress_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<ProgressBar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/load_progress"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:indeterminate="true"
     />

lorsque les données sont chargées dans l'appel de vue de l'adaptateur:

        listview.removeFooterView(progressBar);
0
Abdulhamid Dhaiban