2015-12-02 3 views
0

Я пытаюсь взять данные из бэкэнда (я использую parse.com), поместить его в массив и использовать его для заполнения ListView через адаптер. Я анализирую несколько объектов в списке, а затем помещаю «имена» и «идентификаторы» в два отдельных массива строк.Данные массива исчезают - Android Studio

Теперь моя проблема в том, что данные исчезают, как только я добавляю следующую позицию в массив. Я потратил довольно много времени на то, чтобы понять это с помощью отладочных журналов, и кажется, что имена [0] отображаются в журнале правильно, когда они запрашиваются сразу после его записи. Если я попытаюсь получить доступ к именам [0] после записи имен [1], я получаю исключение нулевого указателя - println нуждается в сообщении, и приложение выйдет из строя. Когда вы не пытаетесь получить доступ к данным через журнал отладки, listview заполняется соответствующим количеством записей, но данные, которые должны были поступать от имен [] и идентификаторов [], пустые. Вот код, где все идет наперекосяк:

names = new String[2]; 
    ids = new String[2]; 
    ParseQuery<ParseObject> query = ParseQuery.getQuery("TestItem"); 

    query.findInBackground(new FindCallback<ParseObject>() { 
     public void done(List<ParseObject> objects, ParseException e) { 

      if (e == null) { 
       int size = objects.size(); 
       int i = 0; 
       ParseObject obj; 

       while (i < size) { 
       obj = objects.get(i); 
       names[i] = obj.getString("name"); 
       ids[i] = obj.getString("objectId"); 
       i++; 
       } 
       /*The following code is fairly irrelevant(I think?) since the error appears 
       to be somewhere in the previous lines.*/ 
       Bundle bundel = new Bundle(); 
       bundel.putStringArray("names", names); 
       bundel.putStringArray("ids", ids); 
       ft = getSupportFragmentManager().beginTransaction(); 
       screen = new Feed().newInstance(bundel); 
       ft.add(R.id.holder_frame, screen); 
       ft.commit(); 
      } else { 

      } 

     } 
    }); 

Я чувствую, что это что-то основное об управлении массивами, но я не могу понять это. Пожалуйста, помогите :(

ответ

0

Следующая строка, кажется подозрительным:.

new Feed().newInstance(bundel); 

newInstance метод должен быть статическим методом Убедитесь, что вы добавляете соответствующий экземпляр фрагмента с информацией о расслоении Если вы не. «т понять это, предоставить код в фрагменте

Рассмотрим код ниже:.

ParseQuery<ParseObject> query = ParseQuery.getQuery("TestItem"); 
query.findInBackground(new FindCallback<ParseObject>() { 
    public void done(List<ParseObject> objects, ParseException e) { 

     if (e == null) { 
      int size = objects.size(); 

      String[] names = new String[size]; 
      String[] ids = new String[size]; 

      for (int i = 0; i < size; i++) { 
       ParseObject elem = objects.get(i); 
       names[i] = elem.getString("name"); 
       ids[i] = elem.getObjectId(); 
      } 

      /*The following code is fairly irrelevant(I think?) since the error appears 
      to be somewhere in the previous lines.*/ 
      Bundle params = new Bundle(); 
      params.putStringArray("names", names); 
      params.putStringArray("ids", ids); 

      ft = getSupportFragmentManager().beginTransaction(); 

      screen = new Feed(); 
      screen.setArguments(params); 

      ft.add(R.id.holder_frame, screen); 
      ft.commit(); 
     } else { 
      Toast.make(<Current>Activity.this, "Error", ...).show(); 
     } 
    } 
}); 
+0

Я изучу его, но есть кое-что, что мне нужно указать здесь, я полагаю. Данные исчезают во время цикла «while» - имена [0] становятся пустыми после того, как были записаны имена [1]. Этот фрагмент кода использовался во фрагменте, в котором размещался ListView, но ошибка все еще была. Я отредактирую фрагмент кода, чтобы сделать его более понятным. – Creepling

+0

Я не обращал на это большого внимания. Почему вы устанавливаете размер 2? Если вы получите результат более 2, вы легко получите '' '' ArrayOutOfBoundException''' –

+0

Просто для тестирования, так как у меня есть ровно 2 записи в базе данных. Я все еще участвую, поэтому обеспечение того, что некоторые части кода не могут привести к ошибке в текущей конфигурации, очень помогает. – Creepling

-1

I-й чернила это может быть проблема:

int size = objects.size(); 
int i = 0; 
ParseObject obj; 

while (i < size) { 
    obj = objects.get(i); 
    names[i] = obj.getString("name"); 
    ids[i] = obj.getString("objectId"); 
    i++; 
} 

имена и идентификаторы инициализируются в

names = new String[2]; 
ids = new String[2]; 

Вы цикл по всем элементам в objects так, если у него есть какие-либо более двух элементов вы будете писать вне границ names и ids массивов.

+0

Это временный код, тестовая база данных имеет ровно два объекта :) Человек выше, похоже, уже решил проблему! – Creepling

+0

Не беспокойтесь, просто что-то, что попалось на глаза. Рад, что вы решили – ewanc

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