Как показать индикатор выполнения (круг) в операции, имеющей список, перед загрузкой списка с данными

У меня есть ListView в моей второй activity.OnItemClick его, я позвонил в веб-сервис и попытался извлечь данные. И после этого я перехожу к третьей активности, которая также имеет ListView с описанием предыдущих элементов ListView .

Я хочу отобразить диалог прогресса перед ListView этого 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> 

Solutions Collecting From Web of "Как показать индикатор выполнения (круг) в операции, имеющей список, перед загрузкой списка с данными"

При загрузке 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" android: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 для извлечения данных для моих списков. Итак, в 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); } 

EDIT: так выглядит в моем приложении при загрузке одного из нескольких ListViews

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

Я использовал этот для загрузки списка, может оказаться полезным.

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> 1 <?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 секунды, тогда он отобразит listview, вместо того, чтобы добавлять данные в статический список stringValues, вы можете получить данные с сервера в doInBackground () и отобразить его.

Вы можете сделать это проще.
Источник: 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, вы должны получить его ссылку в java-файле через класс ProgressBar. Его синтаксис приведен ниже:

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

После этого вы можете заставить его исчезнуть и вернуть его при необходимости с помощью метода setVisibility. Его синтаксис приведен ниже:

 spinner.setVisibility(View.GONE); spinner.setVisibility(View.VISIBLE); 

Расширяете ли вы ListActivity?

Если это так, поместите круговой диалог прогресса со следующей строкой в ​​вашем xml

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

Теперь индикатор прогресса появится до тех пор, пока вы не получите всю информацию о списке, и установите адаптер. В этот момент он вернется к списку, и индикатор выполнения исчезнет.

Пожалуйста, используйте образец на 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. Удачи!

 ProgressDialog dialog = ProgressDialog.show(Example.this, "", "Loading...", true); 

Вы можете добавить ProgressBar в нижний колонтитул listview:

 private ListView listview; private ProgressBar progressBar; 

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

макет / 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); 

Создайте xml-файл с любым именем (скажем progressBar.xml) в drawable и добавьте <color name="silverGrey">#C0C0C0</color> в 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> 

Теперь в вашем XML-файле, где у вас есть listView, добавьте этот код:

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

Я использую это:

 loading = ProgressDialog.show(example.this,"",null, true, true);