2016-04-20 11 views
1

Wenn die App ausgeführt wird, ruft sie die auf dem Parse-Server gespeicherten Benutzer ab und fügt sie dann zu hinzu. Aber wenn ich versuche, die gleiche Liste mit listView zu drucken, ist die listView leer.ArrayList wird automatisch leer

Ich habe versucht Platzierung Protokolle und fand die userList Objekte hat, wenn es in der findInBackground Methode ist aber, nachdem es vorbei ist, wird die Größe von userList 0. Bitte helfen Sie mir die Benutzerliste abrufen und anzeigen aus.

public class Users extends AppCompatActivity { 
    List<String> userList = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.user_list); 

     Intent TimeTableCalled = getIntent(); 
     ParseAnalytics.trackAppOpenedInBackground(getIntent()); 
     ParseQuery<ParseUser> query = ParseUser.getQuery(); 
     query.findInBackground(new FindCallback<ParseUser>() { 
      @Override 
      public void done(List<ParseUser> objects, ParseException e) { 
       if(e==null){ 
        for(ParseObject object:objects){ 
         Log.i("User", object.get("Name").toString()); 
         userList.add(object.get("Name").toString()); 
         Log.i("size in loop", String.valueOf(userList.size())); 
        } 
        Log.i("size out of loop", String.valueOf(userList.size())); 
       } 
       Log.i("size outside if", String.valueOf(userList.size())); 
      } 
     }); 

     Log.i("size", String.valueOf(userList.size())); 
     ListView listView=(ListView) findViewById(R.id.Listview); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,userList); 
     listView.setAdapter(adapter); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String userClicked = parent.getItemAtPosition(position).toString(); 
       Toast.makeText(getApplicationContext(), "Clicked item is " + userClicked, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

Antwort

-1

findInBackground Die Methode führt zu einem Hintergrund-Thread so dass der Code in onCreate(), die tatsächlich nach diesem Aufruf kommt ausgeführt, bevor der Code in dem Rückruf done(), die nur dann ausgeführt wird, nachdem die Abfrage abgeschlossen ist.

Um die listView mit den Inhalten aus der Abfrage zu aktualisieren, rufen Sie einfach adapter.notifyDataSetChanged() am Ende der done() Methode. Dies erfordert eine leichte Umstrukturierung onCreate(), so dass der Adapter in done() referenziert werden kann.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.user_list); 

    ListView listView=(ListView) findViewById(R.id.Listview); 
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,userList); 
    listView.setAdapter(adapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      String userClicked = parent.getItemAtPosition(position).toString(); 
      Toast.makeText(getApplicationContext(), "Clicked item is " + userClicked, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    Intent TimeTableCalled = getIntent(); 
    ParseAnalytics.trackAppOpenedInBackground(getIntent()); 
    ParseQuery<ParseUser> query = ParseUser.getQuery(); 
    query.findInBackground(new FindCallback<ParseUser>() { 
     @Override 
     public void done(List<ParseUser> objects, ParseException e) { 
      if(e==null){ 
       for(ParseObject object:objects){ 
        Log.i("User", object.get("Name").toString()); 
        userList.add(object.get("Name").toString()); 
       } 
       adapter.notifyDataSetChanged(); 
      } 
     } 
    }); 
} 
+0

Vielen Dank! Arbeitete perfekt! –

+0

Gern geschehen. Froh, dass ich helfen konnte. –

0

findInBackground erstellt einen neuen Hintergrundthread. Die Listenansicht und der Adapter befinden sich stattdessen im Hauptthread. Deshalb ist Ihre Variable userList immer noch leer, sie ist auf dem Haupt-Thread, während der andere Thread seinen Job noch nicht beendet hat. Ändere einfach den Code wie George sagte und schau was passiert.