web-dev-qa-db-fra.com

Utilisation de Android AutoCompleteTextView avec ArrayAdapter <Objects> au lieu d'ArrayAdapter <Strings>

Je voulais utiliser AutoCompleteTextView dans mon Android. Je sais comment l'utiliser avec un simple tableau de chaînes, mais je voulais qu'AutoCompleteTextView utilise la liste des objets pour effectuer l'achèvement. Mon code pour cela suit :

CODE D'ACTIVITÉ

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
}

Élève objet de classe a des informations concernant un élève qui sont ID,NAME,ADDRESS,MARKS.

Je sais qu'AutoCompleteTextView a besoin d'un tableau d'objets de type chaîne pour effectuer une opération de recherche.Dans mon cas, je veux qu'AutoCompleteTextView utilise ma liste de tableaux pour effectuer l'achèvement sur la base du champ d'objet étudiant NAME.Je ne sais pas comment dois-je spécifier AutoCompleteTextView pour utiliser le champ NAME de Objet étudiant.Veuillez m'aider à fournir un lien ou un petit exemple.

Merci

26
Anshul

Deux façons:

  1. Redéfinissez toString() dans la classe Student et faites-la retourner name. Vous pouvez obtenir l'objet sélectionné avec le code suivant:

     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. Implémentez un adaptateur personnalisé (en étendant la classe BaseAdapter ou ArrayAdapter<Student> classe) Consultez ce didacticiel: http://www.ezzylearning.com/tutorial.aspx?tid=1763429

74
Sameer

Vous pouvez utiliser un AbstractList pour obtenir la représentation String de chaque élément de votre liste d'objets.

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));
}
4
Italo Borssatto

si vous voulez ajouter les données dans String [] arr = new String [100]; alors c'est faux. Vous pouvez faire le même travail que sous forme d'ArrayList mais n'oubliez pas que vous ne mettrez jamais ici une classe Getter/Setter. Déclarez-le simplement. Voir cet exemple.

Déclarez dans la partition principale:

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

puis l'initier de cette façon:

 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);


            }

J'espère que cela fonctionnera pour vous ....

0
Pooja Kumari