2016-01-14 2 views
0

J'essaie de faire un listview à partir d'une liste contenant ParseUser. Ma classe de recherche renvoie: Liste Parse SDK 1.12 ne prend plus en charge ParseQueryAdapter et la fonction d'adaptateur de profil ne prend pas ParseUser.Comment faire un ListView à partir d'une liste spécifique <ParseUser>?

J'ai essayé d'interroger les ParseObjects à partir de la classe d'analyse _User, mais les objets ne seraient pas renvoyés.

Donc, je travaille à circels, si j'essaie d'obtenir les informations de l'utilisateur dans ParseObject je ne comprends pas. Si je travaille avec ParseUser je ne peux pas faire le ListView. Est-ce que quelqu'un sait comment l'éviter?

J'ai déjà vérifié cette question.

ParseUser Username Adapter in Android ListView doesn't show Data

et

How to fetch the list of users from ParseUser table and show the it in list view in andorid

Mais il ne fonctionne pas avec une liste précise des utilisateurs.

Ceci est mon code.

Java:

public class MainActivity extends ActionBarActivity { 

    Search search; 
    EditText mCityField; 
    List<ParseUser> mAccountList; 

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

     ParseAnalytics.trackAppOpenedInBackground(getIntent()); 

     mCityField = (EditText)findViewById(R.id.mCityField); 
    } 

    public void searchCity(View v){ 
     if(mCityField.getText().toString().length()!=0){ 
      mAccountList = search.searchUsers(mCityField.getText().toString()); 
      Log.i("main", "succesfully searched yo mamma"); 
     } else{ 
      Toast.makeText(MainActivity.this, "You did not enter a city!", Toast.LENGTH_SHORT).show(); 
     } 
    } 

Ceci est ma recherche Classe:

public class Search { 
    List<ParseUser> locals = null; 

    public List<ParseUser> searchUsers(String city){ 
     ParseQuery<ParseUser> query = ParseUser.getQuery(); 
     query.whereEqualTo("City", city); 
     query.findInBackground(new FindCallback<ParseUser>() { 
      public void done(List<ParseUser> userList, ParseException e) { 
       if (e == null) { 
        Log.i("main", "inside if loop" + userList); 

        for (ParseUser user : userList) { 
         Log.i("main", "inside for loop"); 
         String username = user.getString("username"); 
         Log.i("main", "username " + username); 
        } 
        locals = userList; 
       } else { 
        Log.d("score", "Error: " + e.getMessage()); 
       } 
      } 
     }); 
     return locals; 
    } 
} 

Adaptateur CLass:

public class ProfileAdapter extends ParseQueryAdapter<ParseObject> { 
    public ProfileAdapter(Context context, QueryFactory<ParseObject> queryFactory) { 
     super(context, queryFactory); 
    } 
    @Override 
    public View getItemView(final ParseUser user, View v, ViewGroup parent) { 
     // build your views 
    } 
} 
+0

Avez-vous vraiment besoin d'une classe entière pour la méthode 'searchUsers'? Ne pouvez-vous pas inclure cette méthode dans l'activité? –

+0

Cela n'a pas besoin d'être mais je veux séparer les requêtes de mon activité principale. – witlex

+0

Bien sûr, bien sûr ... Où est le 'ListView' dans votre code? Je ne le fais pas ou où vous initialisez un adaptateur. En outre, 'query.findInBackground' s'exécute * de manière asynchrone *, donc' return locals' sera très probablement 'null' quand il est évalué. –

Répondre

0

Le problème ici est que vous utilisez une méthode asynchrone query.findInBackground où la méthode done sera uniquement cal conduit une fois l'appel asynchrone retourne. Jusqu'à ce que cela se produise votre liste locals restera nulle et comme vous le retournez instantanément après une méthode synchrone, vous venez de renvoyer une liste vide de votre méthode searchUsers.

Passer un appel à la méthode dans le bloc done qui crée un nouveau ProfileAdapter et le définir comme l'adaptateur pour votre ListView ou mieux encore, initialiser le ListView avec l'adaptateur lorsque la vue est créé et ajouter une méthode de mise à jour l'ensemble de données sur l'adaptateur, après quoi appelez notifyDatasetChanged sur votre adaptateur et voila il va ajouter les résultats à votre ListView.

Quelque chose comme:

public class ProfileAdapter extends ParseQueryAdapter<ParseObject> { 

private List<ParseUser> mUserList; 

public ProfileAdapter(Context context, QueryFactory<ParseObject> queryFactory) { 
super(context, queryFactory); 
} 

@Override 
public View getItemView(final ParseUser user, View v, ViewGroup parent) { 
// build your views 
} 

public void setData(List<ParseUser> userList) { 
    mUserList = userList; 
    notifyDataSetChanged(); 
} 

@Override 
public int getCount() { 
    return mUserList.size(); 
} 

appel cette méthode setData sur votre adaptateur de votre méthode de rappel done. Cela définira les données renvoyées dans votre adaptateur et notifiera qu'il y a de nouvelles données à afficher. N'oubliez pas de définir l'adaptateur comme adaptateur pour votre ListView dans votre activité.

+0

Idéalement, la variable 'queryFactory' devrait être aller chercher la liste, ne nécessitant pas la liste à être passé après le fait. –

+0

Mais le fait est que le tout nouveau Parse SDK 1.12 ne supporte plus ParseQueryAdapter. Donc j'essaie de trouver une alternative – witlex