Ich habe eine ListView
in meinem zweiten activity.OnItemClick
davon rief ich einen Webservice an und versuchte, Daten abzurufen. Danach gehe ich zur dritten Aktivität über, die auch eine ListView
mit Beschreibung der vorherigen Aktivitäten ListView
hat.
Ich möchte einen Fortschrittsdialog anzeigen, bevor Sie diese ListView
ausfüllen.
Ich verstehe nicht, wie es mit ListView
geht? Weiß jemand, wie es geht?
Mein Code-
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>
Es gibt verschiedene Methoden, um einen Fortschrittsbalken (Kreis) anzuzeigen, während eine activity
geladen wird. In Ihrem Fall eine mit einer ListView
darin.
IN ACTIONBAR
Wenn Sie eine ActionBar
verwenden, können Sie die ProgressBar
so aufrufen (dies könnte in Ihre onCreate()
gehen
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarIndeterminateVisibility(true);
Nachdem Sie die Liste angezeigt haben, können Sie sie ausblenden.
setProgressBarIndeterminateVisibility(false);
IM LAYOUT (das 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>
Und in Ihrer Aktivität (Java) .__ benutze ich eine AsyncTask, um Daten für meine Listen abzurufen. SO, in der AsyncTask onPreExecute()
verwende ich so etwas:
// 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);
}
und in der onPostExecute()
, nachdem der Adapter auf die ListView
eingestellt wurde:
@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);
}
BEARBEITEN: So sieht es in meiner App aus, wenn Sie eine von mehreren ListViews
-Dateien laden.
Sie können das einfacher machen.
Quelle: http://www.tutorialspoint.com/Android/android_loading_spinner.htm
Es hat mir geholfen.
Layout:
<ProgressBar
Android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleLarge"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true" />
Nach der Definition in xml müssen Sie die Referenz in der Java-Datei .__ abrufen. durch die ProgressBar-Klasse. Ihre Syntax ist unten angegeben:
private ProgressBar spinner;
spinner = (ProgressBar)findViewById(R.id.progressBar1);
Danach können Sie es verschwinden lassen und bei Bedarf wieder zurückbringen durch die setVisibility-Methode. Ihre Syntax ist unten angegeben:
spinner.setVisibility(View.GONE);
spinner.setVisibility(View.VISIBLE);
Ich habe dieses hier für das Laden der Listenansicht verwendet.
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>
und meine MainActivity-Klasse ist
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;
}
}
}
wenn diese Aktivität 3 Sekunden lang angezeigt wird, wird die Listenansicht angezeigt. Anstatt statisch Daten zur Liste stringValues hinzuzufügen, können Sie Daten vom Server in doInBackground () abrufen und anzeigen.
Bitte verwenden Sie das Beispiel unter tutorialspoint.com . Die gesamte Implementierung benötigt nur wenige Codezeilen, ohne die XML-Datei zu ändern. Hoffe das hilft.
SCHRITT 1: Bibliothek importieren
import Android.app.ProgressDialog;
SCHRITT 2: Deklarieren Sie die globale Variable ProgressDialog
ProgressDialog loading = null;
SCHRITT 3: Starten Sie den neuen ProgressDialog und verwenden Sie die folgenden Eigenschaften (bitte beachten Sie, dass dieses Beispiel nur den grundlegenden Kreisladebalken ohne Echtzeitstatusstatus abdeckt).
loading = new ProgressDialog(v.getContext());
loading.setCancelable(true);
loading.setMessage(Constant.Message.AuthenticatingUser);
loading.setProgressStyle(ProgressDialog.STYLE_SPINNER);
SCHRITT 4: Wenn Sie AsyncTasks verwenden, können Sie den Dialog in der onPreExecute-Methode anzeigen. Andernfalls platzieren Sie den Code einfach am Anfang Ihres button onClick-Ereignisses.
loading.show();
SCHRITT 5: Wenn Sie AsyncTasks verwenden, können Sie das Fortschrittsdialogfeld schließen, indem Sie den Code in die onPostExecute-Methode einfügen. Andernfalls platzieren Sie einfach den Code, bevor Sie das button onClick-Ereignis schließen.
loading.dismiss();
Getestet mit meinem Nexus 5 Android v4.0.3. Viel Glück!
Erweitern Sie ListActivity?
Wenn ja, setzen Sie einen kreisförmigen Fortschrittsdialog mit der folgenden Zeile in Ihre XML-Datei
<ProgressBar
Android:id="@Android:id/empty"
...other stuff...
/>
Nun wird die Fortschrittsanzeige angezeigt, bis Sie alle Informationen zur Listenansicht haben und den Adapter einstellen. An diesem Punkt wird zur Listenansicht zurückgekehrt und die Fortschrittsleiste wird ausgeblendet.
ProgressDialog dialog = ProgressDialog.show(Example.this, "", "Loading...", true);
Erstellen Sie eine XML-Datei mit einem beliebigen Namen (z. B. progressBar.xml) in drawable und fügen Sie <color name="silverGrey">#C0C0C0</color>
in color.xml hinzu.
<?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>
Fügen Sie nun in Ihrer XML-Datei, in der sich Ihre listView befindet, folgenden Code hinzu:
<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"/>
In AsyncTask in der Methode:
@Override
protected void onPreExecute()
{
progressbar_view.setVisibility(View.VISIBLE);
// your code
}
Und in onPostExecute:
@Override
protected void onPostExecute(String s)
{
progressbar_view.setVisibility(View.GONE);
//your code
}
Klicken Sie auf diese Option innerhalb der Schaltfläche oder auf Ihre Bedürfnisse:
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();
Ich empfehle Ihnen bei der Arbeit mit Listview oder Recyclerview die Verwendung von SwipeRefreshLayout. So was
<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>
Packen Sie nur Ihre Ansicht ein. Dadurch wird eine Animation zum Aktualisieren erzeugt, wenn Daten geladen werden oder der Bildschirm heruntergefahren wird, wie dies in vielen Apps möglich ist.
Hier ist die Dokumentation, wie man es benutzt:
https://developer.Android.com/training/swipe/add-swipe-interface.htmlhttps://developer.Android.com/training/swipe/respond-refresh -request.html
Viel Spaß beim Codieren!
Sie können die ProgressBar
zur Fußzeile der Listenansicht hinzufügen:
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"
/>
wenn die Daten in den Aufruf der Adapteransicht geladen werden:
listview.removeFooterView(progressBar);