У меня ListView
во второй раз activity.OnItemClick
я вызвал веб-службу и пытался получить данные. И после этого я перехожу к третьему занятию, которое также имеет 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>
Ответы:
Есть несколько способов показать индикатор выполнения (кружок) при загрузке
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
источник
progress_medium_holo.xml
а также скопируйте соответствующие изображения в соответствующие папки для рисования.@style/Spinner
?Вы можете сделать это проще.
Источник: 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" />
private ProgressBar spinner; spinner = (ProgressBar)findViewById(R.id.progressBar1);
spinner.setVisibility(View.GONE); spinner.setVisibility(View.VISIBLE);
источник
Я использовал это для загрузки списка, может быть полезно.
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 () и отобразить их.
источник
Воспользуйтесь образцом на сайте 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. Удачи!
источник
Вы расширяете ListActivity?
Если это так, поместите круговой диалог выполнения со следующей строкой в свой xml
<ProgressBar android:id="@android:id/empty" ...other stuff... />
Теперь индикатор выполнения будет отображаться, пока вы не получите всю информацию о просмотре списка и не настроите адаптер. В этот момент он вернется к просмотру списка, а индикатор выполнения исчезнет.
источник
fill_parent
. Затем в качестве второго дочернего элемента для этого relative_layout установите индикатор выполнения по центру как по горизонтали, так и по вертикали.ProgressDialog dialog = ProgressDialog.show(Example.this, "", "Loading...", true);
источник
Создайте 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 }
источник
Вы можете добавить в
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);
источник
Я предлагаю вам при работе со списком или 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-interface.html https://developer.android.com/training/swipe/respond-refresh-request. html
Удачного кодирования!
источник
Используйте кнопку This Within для параметра Click или для ваших нужд:
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();
источник
Панель процесса:
Зависимость:
implementation 'com.github.castorflex.smoothprogressbar:library:1.0.0'
XML:
<fr.castorflex.android.smoothprogressbar.SmoothProgressBar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/myProcessbar" android:layout_width="match_parent" android:layout_height="10dp" android:indeterminate="true" />
В Res-> цвет
<color name="pocket_color_1">#ff1635</color> <integer-array name="pocket_background_colors"> <item>@color/pocket_color_1</item> </integer-array> <color name="pocket_color_stop">#00ff00</color> <integer-array name="pocket_background_stop"> <item>@color/pocket_color_stop</item> </integer-array>
В основном:
public class MainActivity extends AppCompatActivity{ SmoothProgressBar smoothProgressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); smoothProgressBar=findViewById(R.id.myProcessbar); showProcessBar(); stopAnimation(); // call when required to stop process } public void showProcessBar(){ smoothProgressBar.setVisibility(View.VISIBLE); smoothProgressBar.setIndeterminateDrawable(new SmoothProgressDrawable.Builder(getApplicationContext()) .interpolator(new AccelerateInterpolator()) .progressiveStart(true) .progressiveStopSpeed(1000) .build()); smoothProgressBar.setSmoothProgressDrawableBackgroundDrawable( SmoothProgressBarUtils.generateDrawableWithColors( getResources().getIntArray(R.array.pocket_background_colors), ((SmoothProgressDrawable) smoothProgressBar.getIndeterminateDrawable()).getStrokeWidth())); } public void stopAnimation(){ smoothProgressBar.setSmoothProgressDrawableBackgroundDrawable( SmoothProgressBarUtils.generateDrawableWithColors( getResources().getIntArray(R.array.pocket_background_stop), ((SmoothProgressDrawable) smoothProgressBar.getIndeterminateDrawable()).getStrokeWidth())); smoothProgressBar.progressiveStop(); Handler handler=new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { smoothProgressBar.animate().alpha(0.0f).setDuration(6000).translationY(1000); smoothProgressBar.setVisibility(View.GONE); } },1000); } }
источник
Я использую это:
loading = ProgressDialog.show(example.this,"",null, true, true);
источник