2016-03-27 18 views
1

Ich lade ListView aus der Firebase-Datenbank und möchte, dass beim Laden der ListView eine Fortschrittsanzeige angezeigt wird.Wie zeige ich den Fortschrittsbalken beim Laden von ListView an?

Ich habe einige Anleitungen gelesen und ich habe etwas versucht, aber es funktioniert nicht für mich.

Dies ist mein Code:

public class Event_List_Activity extends Activity { 
private static final String FIREBASE_URL="https://****.firebaseio.com/"; 
private Firebase firebaseRef; 
final ProgressBar pb=(ProgressBar)findViewById(R.id.progressBar); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.content_event__list_); 
    Firebase.setAndroidContext(this); 
    firebaseRef = new Firebase(FIREBASE_URL); 

    //populateEventList(); 
    new MyTask().execute(); 

    final ListView listView = (ListView)findViewById(R.id.listView1); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      openEventInfo(parent,view,position,id); 

    } 
    }); 

} 



class MyTask extends AsyncTask<String,Integer,String> 
{ 

@Override 
protected void onPreExecute() 
{ 
    super.onPreExecute(); 
} 

@Override 
protected String doInBackground(String...strings) 
{ 
    populateEventList(); 
    return null; 
} 

@Override 
protected void onProgressUpdate(Integer...values) 
{ 
    super.onProgressUpdate(values); 
    pb.setProgress(values[0]); 

} 

@Override 
protected void onPostExecute(String s) 
{ 
    super.onPostExecute(s); 
} 
} 





private void populateEventList() 
{ 
    firebaseRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 


      ArrayList<String> subTitles = new ArrayList<String>(); 
      ArrayList<EventClass> eventList = new ArrayList<EventClass>(); 
      ArrayList<String> titles = new ArrayList<String>(); 
      for (DataSnapshot user : snapshot.child("users").getChildren()) { 

       String event_title = user.child("event/event_title").getValue().toString(); 

       String event_date = user.child("event/event_date").getValue().toString(); 
       subTitles.add(event_date); 
       String event_content = user.child("event/event_content").getValue().toString(); 
       String age_limit = user.child("event/age_limit").getValue().toString(); 
       String event_hour = user.child("event/event_hour").getValue().toString(); 
       String location_left = user.child("location_left").getValue().toString(); 
       String location_right = user.child("location_right").getValue().toString(); 

       EventClass oneEvent = new EventClass(event_title, event_date, event_content, age_limit, event_hour, location_left, location_right); 
       eventList.add(oneEvent); 

      } 


      for (EventClass event : eventList) { 
       titles.add(event.getEvent_title()); 
      } 
      ArrayAdapter adapter = new ArrayAdapter(Event_List_Activity.this, android.R.layout.simple_list_item_1, titles) { 

       @Override 
       public View getView(int position, View convertView, 
            ViewGroup parent) { 
        View view = super.getView(position, convertView, parent); 

        TextView textView = (TextView) view.findViewById(android.R.id.text1); 
        textView.setTextColor(Color.WHITE); 

        return view; 
       } 
      }; 
      ListView listView = (ListView) findViewById(R.id.listView1); 

      listView.setAdapter(adapter); 


     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
      String message = "Error"; 
      Toast.makeText(Event_List_Activity.this, message, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

} 

private void openEventInfo(AdapterView<?> parent, View view, int position, long id) 
{ 
    final String selectedTitle = parent.getItemAtPosition(position).toString(); 
    firebaseRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot user : dataSnapshot.child("users").getChildren()) { 
       String event_title = user.child("event/event_title").getValue().toString(); 
       if (selectedTitle.equals(event_title)) { 

        String event_date = user.child("event/event_date").getValue().toString(); 
        String event_content = user.child("event/event_content").getValue().toString(); 
        String age_limit = user.child("event/age_limit").getValue().toString(); 
        String event_hour = user.child("event/event_hour").getValue().toString(); 
        String location_left = user.child("location_left").getValue().toString(); 
        String location_right = user.child("location_right").getValue().toString(); 
        final SharedPreferences sp = getSharedPreferences("key", 0); 
        final SharedPreferences.Editor sedt = sp.edit(); 

        sedt.putString("event_title", event_title); 
        sedt.putString("event_date", event_date); 
        sedt.putString("event_content", event_content); 
        sedt.putString("age_limit", age_limit); 
        sedt.putString("event_hour", event_hour); 
        sedt.putString("location_left", location_left); 
        sedt.putString("location_right", location_right); 

        sedt.commit(); 

       } 

      } 
      Intent intent = new Intent(Event_List_Activity.this, EventInfo.class); 
      startActivity(intent); 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
      Toast.makeText(Event_List_Activity.this, "Error", Toast.LENGTH_LONG).show(); 
     } 
    }); 

} 




} 

Nach Kommentar zu lesen, das ist die Veränderung, die ich in meiner MyTask() Methode gemacht habe:

class MyTask extends AsyncTask<String,Integer,String> 
{ 

@Override 
protected void onPreExecute() 
{ 
    super.onPreExecute(); 
    listView.setVisibility(View.INVISIBLE); 
    pb.setVisibility(View.VISIBLE); 
} 

@Override 
protected String doInBackground(String...strings) 
{ 
    populateEventList(); 
    return null; 
} 

@Override 
protected void onProgressUpdate(Integer...values) 
{ 
    super.onProgressUpdate(values); 
    pb.setProgress(values[0]); 
    pb.setMax(values[1]); 


} 

@Override 
protected void onPostExecute(String s) 
{ 
    super.onPostExecute(s); 
    pb.setVisibility(View.GONE); 
    listView.setVisibility(View.VISIBLE); 
} 
} 

Antwort

-1

Sie haben manuell publishProgress in doInBackground irgendwo anrufen AsyncTask publishProgress

EDIT:

Lassen Sie mich etwas konkreter sein ... Wenn Sie nur einen Fortschrittsbalken anzeigen möchten, während Ihre Daten geladen werden, können Sie so etwas tun.

In onPreExecute könnten Sie die listView verstecken und die visibility Ihrer progressBar-VIEW.VISIBLE gesetzt.

Dann in doInBackground jedes Mal, wenn Sie einen neuen Datensatz erhalten, rufen Sie publishProgress(current, max) mit vielleicht die aktuelle Anzahl der empfangenen Daten und die maximale Menge.

Dann in der onProgressUpdate(Integer... values) setzen Sie den neuen Max-Wert von pb.setMax(values[1]) und den tatsächlichen Wert pb.setProgress(values[0]).

Sobald jeder Datensatz geladen onPostExecute() aufgerufen wird und Sie die Sichtbarkeit Ihrer progressBar wieder ändern zu VIEW.GONE und stellen Sie die Sichtbarkeit der ListView zurück zu VIEW.VISIBLE.

+0

Hallo, können Sie mir bitte ein Beispiel geben? Ich habe keine Ahnung, wie es geht ... – Gilad1512

+0

Überprüfen Sie meine Bearbeitung ... – user0815

+0

Hallo, zuerst, danke für den Kommentar! Zweitens habe ich nicht verstanden, was in der Zeile zu tun, die Sie geschrieben haben 'Dann in doInBackground jedes Mal, wenn Sie einen neuen Datensatz erhalten, rufen Sie publishProgress (aktuell, max) mit vielleicht die aktuelle Anzahl der empfangenen Daten und die maximale Menge Was ist der Strom und was ist das Maximum? Und was meinst du, wenn du jedes Mal sagst, wenn ich einen neuen Datensatz erhalte? – Gilad1512

0

Nun FireBase hat komplette Lösung für jede Aufgabe. Hier sehen Sie, wie wir beim Herunterladen oder Hochladen von Inhalten Fortschritte erzielen. Wie auf this blog angegeben, können wir eingebaute Methoden von FireBase API verwenden.

Also zuerst bitte entfernen Sie alle AsyncTask-Code nur zum Herunterladen und zeigen Sie den Fortschritt. FireBase funktioniert bereits in einem anderen Thread, so dass AsyncTask nicht benötigt wird. Also haben Sie etwas wie das tun

StorageReference storageRef = FirebaseStorage.getInstance().reference().child("folderName/file.jpg"); 
Uri file = Uri.fromFile(new File("path/to/images/file.jpg")); 
UploadTask uploadTask = storageRef.putFile(file); 
uploadTask.addOnProgressListener(new OnProgressListener() { 
@Override 
public void onProgress(UploadTask.TaskSnapshot snapshot) { 
    System.out.println(snapshot.getBytesTransferred().toString()); 
} 
}); 

Lassen Sie mich wissen, wenn es Ihnen geholfen hat.

Verwandte Themen