2012-10-02 13 views
8

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

    } 

} 

risposta

6

Sì, proprio l'override del metodo toString() sul tuo POJO.

public class MyObject { 
    ... 

    @Override 
    public String toString() { 
     return showThisStringOnAdapter; 
    } 
} 
+0

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

+0

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

+0

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

3

Creare una classe personalizzata che si estende <AutoCompleteTextView />. Per esempio:

package lt.irisas.akcija.utils; 

import lt.irisas.akcija.data.ItemsModel; 
import android.content.Context; 
import android.database.Cursor; 
import android.util.AttributeSet; 
import android.widget.AutoCompleteTextView; 

/** Customizing AutoCompleteTextView to return Cursor column info as String 
*/ 
public class CustomAutoCompleteTextView extends AutoCompleteTextView { 

    public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    /* Overriding this method and returning String type solves the problem */ 
    @Override 
    protected CharSequence convertSelectionToString(Object selectedItem) { 
     Cursor c = (Cursor) selectedItem; 

     return c.getString(c.getColumnIndex("COLUMN_NAME")); 
    } 
} 

Ma invece di <AutoCompleteTextView/> è necessario utilizzare la vostra abitudine uno. Per esempio:

<LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <lt.irisas.akcija.utils.CustomAutoCompleteTextView 
      android:id="@+id/search_field" 
      android:layout_width="0dip" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:singleLine="true" 
      android:imeOptions="actionSearch" > 
     </lt.irisas.akcija.utils.CustomAutoCompleteTextView> 
</LinearLayout> 

Speranza che aiuta. Beh, almeno lo ha fatto per me.

+0

Non funziona per me ... Il motivo è che ho bisogno di restituire un oggetto della classe Part_Mstr_Info in modo da poter ottenere il nome, desg, org e dept da esso. I miei suggerimenti per il completamento automatico sono due righe ciascuno con il nome sul primo e gli altri tre sul secondo ... Quindi non posso restituire una stringa .. Devo restituire l'oggetto completo ... – Sriman

0

ho trovato la risposta ultima volta. Ho avuto lo stesso problema e sembra che la funzione di completamento automatico utilizzi il metodo convertToString() in modalità orizzontale anziché il metodo newView() e bindView(). Devi restituire tutti i dati del cursore in una sola stringa senza "\ n" come se gli elementi fossero visualizzati orizzontalmente sulla tastiera.

esempio nella tua AutoCompleteTextViewAdapter, aggiungere il metodo:

 @Override 
    public CharSequence convertToString(Cursor cursor) { 


     String name = cursor.getString(0); 
     String number = cursor.getString(1); 


     return name+" : "+number; 
    } 

ho provato con il mio telefono Xperia U e un altro Galaxy Note e funziona. È così semplice Naturalmente, questo metodo si popola a seconda di ciò che si desidera visualizzare.

+0

Grazie ... Lo farò prova questo in pochi giorni e riporti ciò che succede ... – Sriman

0

questa è la tua risposta:

adapter.setCursorToStringConverter(new CursorToStringConverter() { 
    @Override 
    public CharSequence convertToString(Cursor c) { 
     return c.getString(c.getColumnIndexOrThrow("Column")); 
    } 
}); 
10

Il modo giusto per farlo è prevalente il metodo Filter#convertResultToString(Object) nella ArrayFilter classe privata.

Come detto nella documentazione Android

pubblico CharSequence convertResultToString (ResultValue Object)

Converte un valore dal filtrato set in un CharSequence. Sottoclassi dovrebbero sovrascrivere questo metodo per convertire i risultati. L'implementazione predefinita restituisce una stringa vuota per valori nulli o la rappresentazione di stringa predefinita del valore .

Nel tuo caso dovrebbe essere qualcosa di simile:

private class ArrayFilter extends Filter { 
    @Override 
    public CharSequence convertResultToString(Object resultValue) { 
     return ((Part_Mstr_Info) resultValue).get_name(); 
    } 

Aggiungendo questo metodo permetterà al AutoCompleteTextView di fornire corregge suggerimenti (con orientamento orizzontale), invece di riferimenti a oggetti o toString predefinita