Как реализовать интерфейс автоматического предложения с помощью Android Studio?

Я пишу приложение для фотографий. Пользователь может нажать на фотографию человека и отметить его. Я хочу реализовать тегирование следующим образом:

  • 1) Пользователь смотрит на фотографию и узнает Джона Смита.
  • 2) Пользователь нажимает на поле ввода текста.
  • 3) Пользователь начинает печатать "Джо..."
  • 4) Появится список предлагаемых учетных записей gmail, который может выбрать пользователь (например, johny123@gmail.com, johnsmith@gmail.com, joanna@gmail.com).
  • 5) Пользователь нажимает на правильную учетную запись (johnsmith@gmail.com) в списке.
  • 6) Фотография помечена учетной записью, которую выбрал пользователь.

Я реализовал много частей, кроме 4-го. Ниже я представляю код для текущего интерфейса:

// This method is invoked after the user finishes typing and clicks enter.
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
    // other code
    ...

    String usersEntry = textView.getText().toString();
    tagPhotoWith(usersLabel);
    return true;
}

В настоящее время любой текст, который пользователь вводит, становится тегом фотографии после нажатия кнопки ввода. Вместо этого я хочу, чтобы приложение показывало список предлагаемых учетных записей gmail.com, чтобы пользователь мог выбрать соответствующую учетную запись для пометки. Как это сделать?

2 ответа

Решение

Вы должны использовать AutoCompleteTextView, чтобы получить предложения для сохраненных строк (как в вашем случае, они являются идентификаторами электронной почты, независимо от того, были ли они извлечены из базы данных или предварительно определены в программе в какое-то время).

Здесь для AutoCompleteTextView устанавливается адаптер, чтобы получить массив строк /Arraylist, заданный для поля ввода, как только пользователь введет 2 или 3 символа строки.

AutoCompleteTextView textProductView;
textProductView = (AutoCompleteTextView) findViewById(R.id.txtItem);

ArrayAdapter<String> etAdapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ITEMS);
textProductView.setAdapter(etAdapter);

Здесь ITEMS - это строковый массив, определенный в соответствии с данными, извлеченными из пользователя / базы данных или предопределенными в действии.

Если вы хотите отобразить автозаполнение с хорошим графическим интерфейсом, вы можете выбрать либо всплывающее окно, либо использовать настройку просмотра списка или просмотра переработчика и использовать setvisibility Gone/Visible в вашей активности и XML.

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

//activity_main.xml
<LinearLayout 
 //  parent layout
     android:orientation="vertical"
>
     < ....      /* your code for toolbar */          ..../>
     <Edittext 
       android:id="@+id/edittext"
       /*  your customization*/
      />
      <Relativelayou
      android:height="match_parent"
      android:width=""match_parent"
      >
          <LinearLayout > /*your main xml code*/ </LinearLayout>
          <ListView
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:id="@+id/lstvw"
           android:dividerHeight="0dp"
           android:visibility="gone">

         </ListView>

      </RelativeLayout>

В вашей MainActivity используйте EditText.addTextChangedListener.

//MainActivity.java
   EditText ed;
   ListView lst;
   ArrayList<String> array=new ArrayList<>();
   ArrayList<String> array1=new ArrayList<>();

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

    ed= (EditText) findViewById(R.id.edtxt);
    lst= (ListView) findViewById(R.id.lstvw);
    lst.setVisibility(View.GONE);

    ed.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int  ount, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String str=ed.getText().toString();
            array1.clear();
            lst.setVisibility(View.VISIBLE);
            for(int i=0;i<array.size();i++)
            {
                if(array.get(i).toLowerCase().startsWith(str.toLowerCase()))
                {
                    array1.add(array.get(i));
                }
            }
            if((ArrayAdapter<String> )lst.getAdapter()!=null){
            ((ArrayAdapter<String> )lst.getAdapter()).notifyDataSetChanged();}
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
    lst.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            lst.setVisibility(View.GONE);
        }
    });

    ArrayAdapter<String> ad=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,array1);
    ad.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    lst.setAdapter(ad);

}}

Здесь вы можете использовать настраиваемую строку списка в соответствии с вашим дизайном.

Надеюсь, это поможет вам!

Другие вопросы по тегам