Sto usando un adattatore personalizzata con AutoCompleteTextView. Funziona perfettamente con l'emulatore e il mio tablet. Tuttavia, c'è un problema sul mio telefono in modalità orizzontale. Gli hint di completamento automatico mostrati in questa modalità sono informazioni sugli oggetti anziché testo. Tuttavia, quando seleziono una voce, i campi vengono compilati correttamente con il testo nei rispettivi campi.spettacoli AutoCompleteTextView Android oggetto informazioni al posto del testo in modalità orizzontale
Completamento automatico per gli altri settori che si basano su adattatore del Android Stock Array funziona bene.
Devo fare qualcosa per questo nel mio adattatore personalizzato? Ho visto solo una domanda simile su SO. Una risposta a questa domanda stava parlando dell'override del metodo toString ma non riuscivo a capirlo abbastanza da implementarlo nel mio codice.
Qualsiasi orientamento sarà molto apprezzato? Per favore fatemi sapere se avete bisogno di ulteriori informazioni.
EDIT: aggiunto il mio codice sorgente adattatore personalizzato ....
public class Part_Mstr_Info
{
private long part_id;
private String name, desg, org, dept;
public Part_Mstr_Info(long part_id, String name, String desg, String org, String dept)
{
this.part_id = part_id;
this.name = name;
this.desg = desg;
this.org = org;
this.dept = dept;
}
public long get_part_id() { return part_id; }
public String get_name() { return name; }
public String get_desg() { return desg; }
public String get_org() { return org; }
public String get_dept() { return dept; }
}
public class CustomAdapter extends ArrayAdapter<Part_Mstr_Info> implements Filterable{
private List<Part_Mstr_Info> entries;
private ArrayList<Part_Mstr_Info> orig;
private Activity activity;
private ArrayFilter myFilter;
public CustomAdapter(Activity a, int textViewResourceId, ArrayList<Part_Mstr_Info> entries) {
super(a, textViewResourceId, entries);
this.entries = entries;
this.activity = a;
}
public static class ViewHolder{
public TextView tv_ac_name;
public TextView tv_ac_desg;
public TextView tv_ac_org;
public TextView tv_ac_dept;
}
@Override
public int getCount(){
return entries!=null ? entries.size() : 0;
}
@Override
public Part_Mstr_Info getItem(int index) {
return entries.get(index);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if (v == null) {
LayoutInflater vi =
(LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.ac_name_list, null);
holder = new ViewHolder();
holder.tv_ac_name = (TextView) v.findViewById(R.id.ac_name);
holder.tv_ac_desg = (TextView) v.findViewById(R.id.ac_desg);
holder.tv_ac_org = (TextView) v.findViewById(R.id.ac_org);
holder.tv_ac_dept = (TextView) v.findViewById(R.id.ac_dept);
v.setTag(holder);
}
else
holder=(ViewHolder)v.getTag();
final Part_Mstr_Info custom = entries.get(position);
if (custom != null) {
holder.tv_ac_name.setText(custom.get_name());
holder.tv_ac_desg.setText(custom.get_desg());
holder.tv_ac_org.setText(custom.get_org());
holder.tv_ac_dept.setText(custom.get_dept());
}
return v;
}
@Override
public Filter getFilter() {
if (myFilter == null){
myFilter = new ArrayFilter();
}
return myFilter;
}
@Override
public String toString() {
String temp = getClass().getName();
return temp;
}
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (orig == null)
orig = new ArrayList<Part_Mstr_Info>(entries);
if (constraint != null && constraint.length() != 0) {
ArrayList<Part_Mstr_Info> resultsSuggestions = new ArrayList<Part_Mstr_Info>();
for (int i = 0; i < orig.size(); i++) {
if(orig.get(i).get_name().toLowerCase().startsWith(constraint.toString().toLowerCase())){
resultsSuggestions.add(orig.get(i));
}
}
results.values = resultsSuggestions;
results.count = resultsSuggestions.size();
}
else {
ArrayList <Part_Mstr_Info> list = new ArrayList <Part_Mstr_Info>(orig);
results.values = list;
results.count = list.size();
}
return results;
}
@Override
@SuppressWarnings("unchecked")
protected void publishResults(CharSequence constraint, FilterResults results) {
clear();
ArrayList<Part_Mstr_Info> newValues = (ArrayList<Part_Mstr_Info>) results.values;
if(newValues !=null) {
for (int i = 0; i < newValues.size(); i++) {
add(newValues.get(i));
}
if(results.count>0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
}
Ho provato questo ma non funziona .. Probabilmente perché sto sovrascrivendo anche i metodi getview e del filtro ... Quando ho provato a eseguire il debug, il percorso di esecuzione non entra affatto nel metodo toString. Aggiungerò ulteriori dettagli e codice alla mia domanda originale per chiarire ... – Sriman
Basandomi su ciò che vedo nella sorgente di ArrayAdapter, sento di dover fare qualcosa nel metodo getView ma non sono sicuro di cosa si debba fare esattamente ... Come ho detto, funziona perfettamente su tablet ed emulatore. Il problema è solo sul telefono in modalità orizzontale quando non c'è probabilmente abbastanza spazio per mostrare la vista personalizzata che ho ... – Sriman
Dopo aver visto il tuo CustomAdapter che non dovrebbe avere alcun problema, sembra che la causa sia "ConfigChanges", hai fatto ruotare il telefono da verticale a orizzontale? Se sì, guarda [qui] (http://stackoverflow.com/questions/456211/activity-restart-on-rotation-android), può aiutarti – Aprian