2015-12-14 3 views
2

Я новичок в Android в целом, поэтому я просмотрел документацию для AutoCompleteTextView.AutoCompleteTextView с Parse.com (Android)

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
     android.R.layout.simple_dropdown_item_1line, USERS); 
AutoCompleteTextView textView = (AutoCompleteTextView) 
     findViewById(R.id.searchUserTextField); 
textView.setAdapter(adapter); 

Я вижу, что он работает и работает очень мало кода.

private static final String[] COUNTRIES = new String[] { 
     "user1", "user1", "user3", "user4", "user5" 
}; 

Я понимаю, что это растянуть, но что последующие шаги будут по реализации функции автозаполнения на основе моего ParseUser таблицы, тем более, что текст в AutoCompleteTextView изменяется на один символ за один раз? , Очевидно, я бы не заполнил массив USERS с помощью запроса Parse, отображающего всех моих пользователей при каждом попытке поиска. Как я мог бы логически устроить такое?

Начнем с того, что я, вероятно, включать в себя TextChangedListener:

adapter.setNotifyOnChange(true); 
    textView.addTextChangedListener(new TextWatcher() { 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      if (count % 3 == 1) { 
       new Handler().postDelayed(new Runnable() { 

        @Override 
        public void run() { 
         textview.setDropDownHeight(LayoutParams.WRAP_CONTENT); 
         adapter.clear(); 
         // Run my background task here 


        } 
       }, 1000); 
      } 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 

     } 

     public void afterTextChanged(Editable s) { 

     } 
    }); 
    textView.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> adapterview, View v, 
       int position, long arg3) { 
      // TODO Auto-generated method stub 
      searchUserTextField.setText(adapterview.getItemAtPosition(position) 
        .toString()); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 

Но что бы я обеспечиваю в качестве фоновой задачи? Что я спрашиваю, чтобы я не просматривал, скажем, 1000 пользователей одновременно, сколько пользователей в моем приложении сейчас?

+0

Каков ваш прецедент? Например, вы хотите, чтобы любой пользователь искал любого пользователя? Или просто из тех, с которыми они ранее искали/связаны? И где хранится таблица ParseUser? – QuantumTiger

+0

В таблице ParseUser я имел в виду запрос стандартного класса User в Parse. Я бы сказал, что они должны иметь возможность искать любого пользователя, поэтому ввод буквы «s» приведет к появлению первых 100 пользователей, которые начинаются с s (я думаю, что Parse ограничивает запрос до 100 по умолчанию); например, «sa» будет сузить критерии поиска и т. д., например, «в сторону». – santafebound

+0

Возможно, только запустите запрос, если текст не изменился на некоторое время, может быть, что-то наполовину секундное. Поэтому, когда текст изменяется, установите метку времени и сообщение обработчику с задержкой. После задержки, если временная метка не изменилась, запустите запрос. Просто с головы. – nasch

ответ

0

Это похоже на работу. Он статичен в том смысле, что он всегда печатает первые 100 пользователей в вашем классе User. Я уверен, что вы можете добавить ограничение, совпадающее с первой или второй буквой AutoCompleteTextView, с именами пользователей.

ParseQuery<ParseUser> userQuery = ParseUser.getQuery(); 
userQuery.findInBackground(new FindCallback<ParseUser>() { 
    public void done(List<ParseUser> parseUsers, ParseException e) { 
     if (e == null) { 
      Log.d("users", "Retrieved " + parseUsers.size()); 
      ParseUser[] data = parseUsers.toArray(new ParseUser[parseUsers.size()]); 
      String[] strings = new String[data.length]; 
      for (int i = 0; i < data.length; i++) { 
       strings[i] = data[i].getString(ParseConstants.KEY_USERNAME); 
      } 
      // Test to see if it was correctly printing out the array I wanted. 
      // System.out.println(Arrays.toString(strings)); 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_dropdown_item_1line, strings); 
      AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.searchUserTextField); 
      if(parseUsers.size() < 40) textView.setThreshold(1); 
      else textView.setThreshold(2); 
      textView.setAdapter(adapter); 
     } else { 
      Log.d("users", "Error: " + e.getMessage()); 
     } 
    } 
}); 
Смежные вопросы