2015-06-07 2 views
0

У меня есть строки, хранящиеся (объекты ID) в моем внутреннем хранилище. Когда я хочу отобразить список сохраненных идентификаторов, однако, когда я пытаюсь получить имена из Parse.com, он не отображается в списке. Это показывает ObjectIds:Список не отображает данные

public class UserListForHistory extends ListActivity { 

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

    SharedPreferences settings = getSharedPreferences("NotificationIDs", Context.MODE_PRIVATE); 
    Set<String> myStrings = settings.getStringSet("myStrings", new HashSet<String>()); 

    ListView idList; 
    List<String> idListData; 
    idListData = new ArrayList<String>(); 
    idList = (ListView) findViewById(android.R.id.list); 

    for(String userIds : myStrings){ 

     idListData.add(userIds); 

    } 

    ArrayAdapter<String> str = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, idListData); 
    idList.setAdapter(str); 


} 

Однако, когда добавить это «за» Это не что-либо в списке отображения! Но он отображает все имена в logcat. Кто-нибудь видит проблему?

public class UserListForHistory extends ListActivity { 

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

    SharedPreferences settings = getSharedPreferences("NotificationIDs", Context.MODE_PRIVATE); 
    Set<String> myStrings = settings.getStringSet("myStrings", new HashSet<String>()); 

    final ListView idList; 
    final List<String> idListData; 
    idListData = new ArrayList<>(); 
    idList = (ListView) findViewById(android.R.id.list); 

    for(String userIds : myStrings) { 

     ParseQuery<ParseObject> query = ParseQuery.getQuery("_User"); 
     query.getInBackground(userIds, new GetCallback<ParseObject>() { 
      @Override 
      public void done(ParseObject parseObject, ParseException e) { 
       String name = parseObject.getString("fullname"); 
       Log.d("These are the names: ", name); 

       idListData.add(name); 
      } 
     }); 

    } 
    ArrayAdapter<String> str = new ArrayAdapter<>(getBaseContext(), android.R.layout.simple_list_item_1, idListData); 
    idList.setAdapter(str); 


} 

ответ

1

Вызовы внутри этого для цикла:

for(String userIds : myStrings) { 
    query.getInBackground(userIds, new GetCallback<ParseObject>() { 
     @Override 
     public void done(ParseObject parseObject, ParseException e) { 
      String name = parseObject.getString("fullname"); 
      Log.d("These are the names: ", name); 

      idListData.add(name); 
     } 
    }); 
} 

асинхронно, что означает, что idListData все еще пуст, когда ваш код достигает следующие строки:

ArrayAdapter<String> str = new ArrayAdapter<>(getBaseContext(), android.R.layout.simple_list_item_1, idListData); 
idList.setAdapter(str); 

Чтобы исправить это, вы можете сделать примерно следующее:

final ArrayAdapter<String> str = new ArrayAdapter<>(getBaseContext(), android.R.layout.simple_list_item_1, new ArrayList<>()); 
idList.setAdapter(str); 

for(String userIds : myStrings) { 
    query.getInBackground(userIds, new GetCallback<ParseObject>() { 
     @Override 
     public void done(ParseObject parseObject, ParseException e) { 
      String name = parseObject.getString("fullname"); 
      Log.d("These are the names: ", name); 

      str.add(name); 
     } 
    }); 
} 

В этом коде адаптер соединен с списком синхронно, а асинхронно полученные данные затем добавляются к адаптеру, когда он доступен. Ваша точная реализация может зависеть от того, как часто вы выполняете этот набор запросов, но приведенный выше код (не скомпилированный, поэтому может содержать опечатки) должен иллюстрировать общий принцип для вас.

Смежные вопросы