web-dev-qa-db-ja.com

リストビューにデータをロードする前に、リストビューを持つアクティビティのプログレスバー(円)を表示する方法

私はそれの私の2番目のactivity.OnItemClickListViewを持っています私はウェブサービスと呼び、データを取得しようとしています。そしてその後、私はListViewが以前の活動の説明を持っているListViewアイテムを持っている3番目の活動に移っています。

このListViewを入力する前に、進行状況ダイアログを表示したいです。

ListViewでそれを行う方法がわかりませんか?誰かがそれを行う方法を知っていますか?

私のコード -

ThirdActivity.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>
138
Ani

activityのロード中にプログレスバー(円)を表示する方法はいくつかあります。あなたの場合は、その中にListViewがあります。

アクションバー

あなたがActionBarを使っているならば、あなたはこのようにProgressBarを呼ぶことができます(これはあなたのonCreate()に入ることができます)

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

そしてリストを表示し終えたら、それを隠します。

setProgressBarIndeterminateVisibility(false);

レイアウト内(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>

そしてあなたの活動(Java)では、AsyncTaskを使って私のリストのデータを取得しています。つまり、AsyncTaskのonPreExecute()では、次のようにしています。

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

onPostExecute()では、アダプタを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);
}

編集:これはいくつかのListViewsの一つをロードしている間私のアプリでどのように見えるかです。

enter image description here

171
Siddharth Lele

これはもっと簡単にできます。
出典: http://www.tutorialspoint.com/Android/android_loading_spinner.htm
それは私を助けました。

レイアウト:

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

Xmlで定義した後は、ProgressBarクラスを介してJavaファイルでその参照を取得する必要があります。その構文は以下のとおりです。

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

その後、それを消して、必要に応じてsetVisibilityメソッドを使って元に戻すことができます。その構文は以下のとおりです。

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

私はこれをリストビューのロードに使用しましたが役に立つかもしれません。

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>

そして私のMainActivityクラスは、

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

このアクティビティは3秒間進行状況を表示し、それからリストビューを表示します。あなたはデータを静的にstringValuesリストに追加する代わりにあなたはdoInBackground()でサーバーからデータを得てそれを表示することができます。

19

サンプルを tutorialspoint.com で使用してください。 xmlファイルを変更せずに、実装全体で必要なコードは数行だけです。お役に立てれば。

ステップ1:インポートライブラリ

import Android.app.ProgressDialog;

ステップ2:ProgressDialogグローバル変数を宣言する

ProgressDialog loading = null;

ステップ3:新しいProgressDialogを起動し、次のプロパティを使用します(このサンプルでは、​​進行状況をリアルタイムで表示することなく、基本的なサークルローディングバーのみをカバーしています)。

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

ステップ4:AsyncTasksを使用している場合は、onPreExecuteメソッドでダイアログの表示を開始できます。それ以外の場合は、ボタンのonClickイベントの先頭にコードを配置してください。

loading.show();

ステップ5:AsyncTasksを使用している場合は、コードをonPostExecuteメソッドに配置して進行状況ダイアログを閉じることができます。それ以外の場合は、ボタンのonClickイベントを閉じる前にコードを配置してください。

loading.dismiss();

私のNexus 5 Android v4.0.3でそれをテストしました。がんばろう!

9

ListActivityを拡張していますか?

そうであれば、あなたのxmlに次の行を含む循環の進捗ダイアログを入れてください

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

これで、リストビュー情報がすべて揃うまで進行状況インジケータが表示され、アダプタを設定できます。その時点で、それはリストビューに戻り、プログレスバーは消えます。

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

Drawableに任意の名前(例えばprogressBar.xml)のxmlファイルを作成し、color.xmlに<color name="silverGrey">#C0C0C0</color>を追加します。

<?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>

今すぐあなたのlistViewがあるあなたのxmlファイルにこのコードを追加してください:

 <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"/>

メソッドのAsyncTaskで:

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

    // your code
}

そしてonPostExecuteでは:

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

    //your code
}
1
Vaibhav Joshi

[クリック]オプションまたは[ニーズ]の[この範囲内]ボタンを使用します。

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

Listviewやrecyclerviewを使ってSwipeRefreshLayoutを使用するときにお勧めします。このような

    <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>

ビューをラップするだけで、データをロードするときや画面を下にスワイプすることによって、多くのアプリケーションで可能なようにリフレッシュのアニメーションが作成されます。
これは使い方の説明です。
https://developer.Android.com/training/swipe/add-swipe-in​​terface.htmlhttps://developer.Android.com/training/swipe/respond-refresh-request.html

ハッピーコーディング!

0
Gian Gomen

リストビューフッターにProgressBarを追加することができます。

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"
     />

データがアダプタビュー呼び出しにロードされると、

        listview.removeFooterView(progressBar);
0