2017-03-14 3 views
0

Dans mon fragment d'application i suis en train de valeurs pour arrayList par des données de chargement pour le serveur dans onCreate() méthode, puis je veux afficher ces données en listView avec l'aide de l'adaptateur, mais quand je lance mon programme, il exécute onCreateView() avant de code de réseau qui est en onCreate() procédéEffectuer des opérations de réseau avant onCreateView

onCreate()

ArrayList<ContactItem> contactsList = new ArrayList<ContactItem>(); 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    final QBUser qbUser = new QBUser("username", "password"); 
    QBAuth.createSession(qbUser).performAsync(new QBEntityCallback<QBSession>() { 
     @Override 
     public void onSuccess(QBSession qbSession, Bundle bundle) { 
      Toast.makeText(getActivity(), "created", Toast.LENGTH_SHORT).show(); 

      for (int i = 0; i < contactName.size(); i++) { 
       QBUsers.getUserByLogin(contactNumber.get(i).replaceAll(" ", "")).performAsync(new QBEntityCallback<QBUser>() { 
        @Override 
        public void onSuccess(QBUser qbUser, Bundle bundle) { 
         if (qbUser != null) { 
          final ContactItem contactItem = new ContactItem(qbUser.getFullName(), qbUser.getLogin(), R.drawable.profile); 
          contactsList.add(contactItem); 

         } 

        } 

        @Override 
        public void onError(QBResponseException e) { 

        } 
       }); 
      } 




     } 

     @Override 
     public void onError(QBResponseException e) { 
      Toast.makeText(getActivity(), "failed " + e.toString(), Toast.LENGTH_LONG).show(); 
     } 
    }); 

}

onCreateView() Ajouter un fragment ou une méthode de fragment d'appel à un rappel de réponse réseau.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_contacts, container, false); 

    ListView listView = (ListView) rootView.findViewById(R.id.contacts_listview); 

    contactItemAdapter = new ContactItemAdapter(getActivity(), contactsList); 
    listView.setAdapter(contactItemAdapter); 

    return rootView; 
} 
+0

ajoutez votre 'onCreate()' aussi –

+0

Alors quoi? C'est comme ça que ça doit marcher. L'appel réseau prend beaucoup plus de temps que votre téléphone a besoin pour exécuter 'onCreate()' et 'omCreateView()'. Quel est le problème avec la mise à jour du contenu de l'adaptateur une fois l'appel réseau terminé? –

Répondre

0

Dans votre code, onCreate() est appelée, puis onCreateView() est appelée. Mais votre requête API s'exécute en arrière-plan, car avant la réponse du serveur, votre onCreateView() est déjà appelée et par conséquent, il n'y a pas de données dans contactsList.

Vous pouvez déplacer les lignes ci-dessous de onCreateView()

contactItemAdapter = new ContactItemAdapter(getActivity(), contactsList); 
listView.setAdapter(contactItemAdapter); 

Pour onSuccess(), après que vous mettez des données à partir du serveur en Liste des contacts, à savoir à la fin de la onSuccess externe().

+0

J'ai édité ma réponse selon votre modification. –

0

Cela se produit parce que votre fragment est chargé avant la réponse du réseau.