Использование Android AutoCompleteTextView с ArrayAdapter‹Objects› вместо ArrayAdapter‹Strings›

Я хотел использовать AutoCompleteTextView в своем приложении для Android. Я знаю, как использовать его с простым массивом строк, но я хотел, чтобы AutoCompleteTextView использовал список объектов для выполнения завершения. Мой код для этого следующий:

КОД АКТИВНОСТИ

public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);

        initialize();
        ArrayAdapter<Student> adapter = new ArrayAdapter<Student>(this,
                R.layout.dropdown_list_item, GetAllStudentsList());

        searchBox.setAdapter(adapter);
        searchBox.setThreshold(THRESHOLD_VALUE);
        searchBox.setTextColor(Color.BLACK);
}

searchBox.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view,
                int position, long arg3) {
                     //Here i will grab the Student object that user selected from drop-down

        }

    });

public ArrayList<Movies> GetAllStudentsList() {

//This method returns a ArrayList of <Student> type objects
}

Объект класса Студент содержит информацию об учащемся ID,NAME,ADDRESS,MARKS.

Я знаю, что AutoCompleteTextView нуждается в массиве объекта типа String для выполнения операции поиска. В моем случае я хочу, чтобы AutoCompleteTextView использовал мой ArrayList для выполнения завершения на основе поля объекта Student NAME. Я не знаю, как мне указать AutoCompleteTextView для использования поля NAME из Студенческий объект. Пожалуйста, помогите мне предоставить любую ссылку или небольшой пример.

Спасибо


person Anshul    schedule 25.10.2012    source источник
comment
Думаю, мне нужно сделать Custom AutoCompleteTextView и переопределить некоторые методы.   -  person Anshul    schedule 25.10.2012


Ответы (4)


Два пути:

  1. Переопределите toString() в классе Student и заставьте его возвращать name. Вы можете получить выбранный объект с помощью следующего кода:

     public static class Student {
    
        private String name;
    
            public Student(String name) {
                this.name = name;
            }
    
            @Override
            public String toString() {
                return name;
            }
    
        }
    
    AutoCompleteTextView tv = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
    final ArrayList<Student> list = new ArrayList<MainActivity.Student>();
    list.add(new Student("Viru"));
    list.add(new Student("Gauti"));
    ArrayAdapter<Student> adapter = new ArrayAdapter<MainActivity.Student>(
            this, android.R.layout.simple_dropdown_item_1line, list);
    tv.setAdapter(adapter);
    
    tv.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            Student selected = (Student) arg0.getAdapter().getItem(arg2);
            Toast.makeText(MainActivity.this,
                    "Clicked " + arg2 + " name: " + selected.name,
                    Toast.LENGTH_SHORT).show();
        }
    });
    
  2. Реализуйте пользовательский адаптер (путем расширения класса BaseAdapter или класса ArrayAdapter<Student>). Ознакомьтесь с этим руководством: http://www.ezzylearning.com/tutorial.aspx?tid=1763429

person Sameer    schedule 25.10.2012
comment
если я использую toString(), то, когда пользователь выбирает элемент из раскрывающегося списка, я получу не объект, а строку, и тогда мне придется искать объект, используя эту строку, верно? - person Anshul; 25.10.2012
comment
Вы получаете выбранный индекс. Вы можете использовать это, чтобы получить объект. - person Sameer; 25.10.2012
comment
Выбранный индекс раскрывающегося списка и AutoCompleteView будут использовать строковое представление объектов, а не фактические объекты? - person Anshul; 25.10.2012
comment
просто и понятно :) лучший пример что я видел. - person narb; 08.04.2017
comment
Однако я думаю, что этот пост отвечает на вопрос наилучшим образом: а) Для чего нужен tv.setOnItemClickListener? б) Если вы используете Студенты для адаптера в представленном виде, появится окно автоматического предложения со списком строк. Как отобразить другие вещи в поле самовнушения (например, изображение ученика)? - person mercury0114; 22.07.2017
comment
Это была toString() !! спасибо за сыр - person Cheese Bread; 07.09.2019

Вы можете использовать AbstractList, чтобы получить String представление каждого элемента в вашем списке объектов.

private void setupAutoComplete(AutoCompleteTextView view, List<T> objects) {
    List<String> names = new AbstractList<String>() {
        @Override
        public int size() { return objects.size(); }

        @Override
        public String get(int location) {
            return objects.get(location).getName();
        }
    };

    view.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names));
}
person Italo Borssatto    schedule 14.06.2016
comment
Это лучший ответ, так как вы не изменяете POJO для представления! - person Susanta; 11.02.2020

если вы хотите добавить данные в String[] arr=new String[100]; то это неправильно. Вы можете делать ту же работу, что и в форме ArrayList, но помните, что вы никогда не поместите сюда класс Getter/Setter. Просто заявите об этом. См. этот пример.

Объявите в основном разделе:

 ArrayList<String>arr=new ArrayList<>();

а затем инициализируйте его следующим образом:

 for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject1 = (JSONObject) jsonArray.get(i);
                    String imei = jsonObject1.getString("imei");
                    String name = jsonObject1.getString("name");
                    String my_pic = jsonObject1.getString("my_pic");
                    String email = jsonObject1.getString("email");

                    arr.add(name);
                }


                adapter= new ArrayAdapter<>
                        (this, android.R.layout.select_dialog_item, arr);
                autoCompleteText.setThreshold(1);//will start working from first character
                autoCompleteText.setAdapter(adapter);//setting the adapter data into the AutoCompleteTextView
                autoCompleteText.setTextColor(Color.RED);


            }

Я надеюсь, что это сработает для вас....

person Pradeep Kumar    schedule 04.09.2019

Вы можете переопределить getItem в этом адаптере, в зависимости от каждого типа, чтобы преобразовать его в строку.

 override fun getItem(position: Int): String? {
        val item = listData[position]
        when (item) {
            is BankItem -> {
                return item.bankName
            }
        ....
 }
person beokh    schedule 01.07.2020