2015-10-26 3 views
1

У меня есть простое приложение, в котором пользователи регистрируются и регистрируются, и я хочу, чтобы они могли искать других пользователей.Попытка заполнить ListView результатами из запроса Parse

Я использую parse.com для хранения моих пользователей и их деталей и ищут способ поиска пользователей (используя имена, номера телефонов, электронные письма и т. Д.) И показывая их все в виде списка , но я вышел пустым. Большинство ответов и руководств связаны с использованием ParseQueryAdapter, но похоже, что этот класс больше не включен в SDK.

У кого-нибудь есть опыт?

Спасибо за ваше время

EDIT: Я был возиться с ParseQuery, чтобы попытаться получить что-то. Это то, что я до сих пор:

searchButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       ParseQuery<ParseUser> query = ParseUser.getQuery(); 
       //TODO search function 

       query.whereContains("name", searchText.getText().toString().trim()); 
       query.findInBackground(new FindCallback<ParseUser>() { 
        @Override 
        public void done(List<ParseUser> objects, ParseException e) { 
         if (e == null) { 
          Log.d("Brand", "Retrieved " + objects.size() + " Brands"); 
          for (ParseObject dealsObject : objects) 
          { 
           Log.i("USERNAME", dealsObject.getString("name")); 
           // use dealsObject.get('columnName') to access the properties of the Deals object. 
          } 
         } else { 
          Log.d("Brand", "Error: " + e.getMessage()); 
         } 
        } 
       }); 


      } 
     }); 

Этот код выводит количество результатов поиска, а также «имя» атрибут для каждого результатов испытаний в журнал.

Кроме того, я уже сделал макет для каждого элемента в виде списка, содержащего имя, адрес электронной почты, номер телефона и такие данные. Раньше, прежде чем я начал использовать Parse, я использовал локальную базу данных MySQL для хранения моих пользователей. Затем я бы поискал пользователя, который возвратил JsonArray, и я бы поместил каждый атрибут в пользовательский объект «searchresult», у которого были методы get() и set() для атрибутов поиска. После этого у меня был ArrayAdapter, к которому я добавил результаты. Этот метод был своего рода неэффективным, тем более, что я не эксперт в PHP и Json.

+0

Я предполагаю, что вы с помощью SDK, [ 'ParseQuery'] (https: // синтаксического анализа .com/Docs/Android/API/ком/синтаксический анализ/ParseQuery.html). (Если это так, пожалуйста, укажите это в вопросе.) Можете ли вы показать нам, как вы его используете? Например, жесткий код запроса, который получает результаты из * вашего * набора данных? После этого мы можем показать вам, как создать «ListView», используя результаты. – kdbanman

+0

До сих пор у меня нет рабочего ParseQuery, поскольку я застрял, пытаясь понять, как это работает, и как он возвращает результаты. В идеале я думаю, что мне понадобится, чтобы вернуть список пользователей, соответствующих строке поиска. Я обновлю сообщение с тем, что у меня было до сих пор – iVikD

+0

[This] (http://stackoverflow.com/questions/17222158/parse-com-get-value-with-query) и [this] (http: // www.programcreek.com/java-api-examples/index.php?api=com.parse.ParseQuery) и [это] (https://www.youtube.com/watch?v=wsBWDbmYPwg) должны вас поймать. * Когда * вы получаете то, что возвращает результаты, * то * ваша проблема с ListView имеет значение. Просто убедитесь, что вы опубликовали рабочий код для работы с нами. – kdbanman

ответ

0

нашел способ сделать это. Во-первых, поиск любого пользователя соответствие любые поля:

String searchParams = searchText.getText().toString().trim(); 

       if(!searchParams.isEmpty()) { 
        final ArrayList<SearchResults> searchResults = new ArrayList<SearchResults>(); 
        listAdapter = new ListAdapter(activityContext, searchResults); 
        listView.setAdapter(listAdapter); 

        ParseQuery<ParseUser> queryName = ParseUser.getQuery(); 
        queryName.whereContains("name", searchParams); 
        ParseQuery<ParseUser> queryPhone = ParseUser.getQuery(); 
        queryPhone.whereContains("username", searchParams); 
        ParseQuery<ParseUser> queryEmail = ParseUser.getQuery(); 
        queryEmail.whereContains("email", searchParams); 
        ParseQuery<ParseUser> querySurname1 = ParseUser.getQuery(); 
        querySurname1.whereContains("surname1", searchParams); 
        ParseQuery<ParseUser> querySurname2 = ParseUser.getQuery(); 
        querySurname2.whereContains("surname2", searchParams); 

        List<ParseQuery<ParseUser>> queries = new ArrayList<ParseQuery<ParseUser>>(); 
        queries.add(queryName); 
        queries.add(queryPhone); 
        queries.add(queryEmail); 
        queries.add(querySurname1); 
        queries.add(querySurname2); 

        ParseQuery<ParseUser> mainQuery = ParseQuery.or(queries); 

        mainQuery.findInBackground(new FindCallback<ParseUser>() { 
         @Override 
         public void done(List<ParseUser> objects, ParseException e) { 
          if (e == null) 
          { 
           Log.d("Brand", "Retrieved " + objects.size() + " Brands"); 
           for (ParseObject dealsObject : objects) { 
            Log.i("USERNAME", dealsObject.getString("name")); 
            Log.i("PRIVATE", Integer.toString(dealsObject.getInt("private"))); 
            SearchResults sr1 = new SearchResults(); 
            sr1.setName(dealsObject.getString("name")); 
            sr1.setSurname1(dealsObject.getString("surname1")); 
            sr1.setSurname2(dealsObject.getString("surname2")); 
            sr1.setUid(dealsObject.getObjectId()); 
            Log.d("UID",dealsObject.getObjectId()); 

            if(dealsObject.getInt("private") == 0) 
            { 
             sr1.setEmail(dealsObject.getString("email")); 
             sr1.setPhone(dealsObject.getString("username")); 
            } 
            else 
            { 
             sr1.setPhone("xxx-xxx-xxx"); 
             sr1.setEmail("[email protected]"); 
            } 

            searchResults.add(sr1); 
           } 
          } else { 
           Log.d("Brand", "Error: " + e.getMessage()); 
          } 

          listAdapter.notifyDataSetChanged(); 

И мой SearchResults класс:

public class SearchResults 
{ 
    private String name = ""; 
    private String surname1 = ""; 
    private String surname2 = ""; 
    private String phone = ""; 
    private String email = ""; 
    private Bitmap image; 
    private String uid = ""; 

    public String getEmail() { 
     return email; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 

    public Bitmap getImage() { 
     return image; 
    } 

    public void setImage(Bitmap image) { 
     this.image = image; 
    } 

    public String getUid() { 
     return uid; 
    } 

    public void setUid(String uid) { 
     this.uid = uid; 
    } 

    public String getSurname1() { 
     return surname1; 
    } 

    public String getSurname2() { 
     return surname2; 
    } 

    public void setSurname1(String surname1) { 
     this.surname1 = surname1; 
    } 

    public void setSurname2(String surname2) { 
     this.surname2 = surname2; 
    } 
} 
0

вы можете попробовать, как этот

query.whereContains("name", searchText.getText().toString().trim()); 
query.whereContains("phone", searchText.getText().toString().trim()); 
query.whereContains("emails", searchText.getText().toString().trim()); 
+0

О, ладно, я обязательно попробую это, я не подумал об этом. Это решит одну часть моей проблемы, и я думаю, что могу реализовать свой предыдущий класс, чтобы заполнить ListView. – iVikD

+0

Просто попробовал, кажется, не работает. Я думаю, что если я это сделаю, он ищет совпадение в «имени» и «телефоне» и т. Д., Но мне нужно, чтобы он был OR. Он должен вернуть пользователя, если он найдет параметр поиска в любом из своих полей. – iVikD

+0

Выяснилось, что необходимо создать несколько разных запросов, по одному на ограничение поля, а затем добавить в список запросов. После этого создается другой запрос типа ParseQuery.or(), который принимает в качестве аргумента список запросов. – iVikD

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