2012-10-02 13 views
8

Ich verwende einen benutzerdefinierten Adapter mit AutoCompleteTextView. Es funktioniert gut auf dem Emulator und meinem Tablet. Auf meinem Telefon ist jedoch ein Problem im Querformat aufgetreten. Die Auto-Complete-Hinweise, die in diesem Modus angezeigt werden, sind Objekt-Informationen und nicht Text. Wenn ich jedoch ein Element auswähle, werden die Felder korrekt mit Text in den entsprechenden Feldern ausgefüllt.Android AutoCompleteTextView zeigt Objektinformationen anstelle von Text im Querformat

Auto Complete für andere Felder, die auf Android Stock Array Adapter funktionieren, funktioniert gut.

Muss ich etwas dafür in meinem benutzerdefinierten Adapter tun? Ich sah nur eine ähnliche Frage zu SO. Eine Antwort für diese Frage war, die toString-Methode zu überschreiben, aber ich konnte sie nicht genug verstehen, um sie in meinen Code zu implementieren.

Jede Anleitung wird sehr geschätzt werden? Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

EDIT: meine benutzerdefinierte Adapter Quellcode hinzugefügt ....

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

    } 

} 

Antwort

6

Ja, außer Kraft setzen nur die toString() -Methode auf POJO.

public class MyObject { 
    ... 

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

Ich habe es versucht, aber es funktioniert nicht. Wahrscheinlich, weil ich Filter und getview Methoden auch überschreiben ... Wenn ich versuchte zu debuggen, geht der Ausführungspfad überhaupt nicht in die toString Methode .. Ich werde mehr Details hinzufügen und Code zu meiner ursprünglichen Frage zu klären ... – Sriman

+0

Basierend auf dem, was ich in der ArrayAdapter-Quelle doe sehe, habe ich das Gefühl, dass ich etwas in der getView-Methode tun muss, aber nicht genau, was genau zu tun ist ... Wie ich schon sagte, funktioniert es perfekt auf Tablets und Emulatoren. Das Problem ist nur auf Telefon im Querformat, wenn nicht wahrscheinlich genug Platz ist, um die benutzerdefinierte Ansicht anzuzeigen, die ich habe ... – Sriman

+0

Nachdem Sie Ihren CustomAdapter gesehen haben, der keine Probs haben sollte, scheint die Ursache 'ConfigChanges', tat Sie das Telefon von Hochformat auf Querformat drehen? Wenn ja, schau [hier] (http://stackoverflow.com/questions/456211/activity-restart-on-rotation-android), kann dir helfen – Aprian

3

Erstellen Sie benutzerdefinierte Klasse, die <AutoCompleteTextView /> erweitert. Zum Beispiel:

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

Aber statt <AutoCompleteTextView/> müssen Sie Ihre benutzerdefinierten ein verwenden. Zum Beispiel:

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

Ich hoffe, es hilft. Zumindest hat es für mich getan.

+0

Funktioniert nicht für mich ... Der Grund ist, dass ich ein Objekt der Klasse Part_Mstr_Info zurückgeben muss damit ich den Namen, desg, org und dept davon bekommen kann. Meine Auto-Vervollständigung-Vorschläge sind zwei Zeilen mit Namen auf dem ersten und die anderen drei Felder auf dem zweiten ... So kann ich nicht einfach eine Zeichenfolge zurückgeben .. Ich muss das komplette Objekt zurückgeben ... – Sriman

0

Ich habe die Antwort beim letzten Mal gefunden. Ich hatte das gleiche Problem und es scheint, dass Autovervollständigung ConvertToString() -Methode im Querformat statt NewView() und BindView() -Methode verwendet. Sie müssen alle Ihre Cursor-Daten in eine einzelne Zeichenfolge ohne "\ n" zurückgeben, so wie die Elemente horizontal über der Softkey-Tastatur angezeigt werden.

Beispiel in Ihrem AutoCompleteTextViewAdapter, fügen Sie die Methode:

 @Override 
    public CharSequence convertToString(Cursor cursor) { 


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


     return name+" : "+number; 
    } 

ich es mit meinem Handy Xperia U und anderen Galaxy Note getestet und es funktioniert. So einfach ist das. Natürlich füllen Sie diese Methode abhängig davon, was Sie anzeigen möchten.

+0

Danke ... werde ich versuche dies in ein paar Tagen und berichte zurück, was passiert ... – Sriman

0

ist dies Ihre Antwort:

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

Der richtige Weg, es überschreibt die Methode Filter#convertResultToString(Object) in Ihrer ArrayFilter privaten Klasse zu tun.

Wie gesagt in der Android Dokumentation

public CharSequence convertResultToString (Object Result)

Wert Wandelt aus der in eine CharSequence gesetzt filtriert. Unterklassen sollten diese Methode überschreiben, um ihre Ergebnisse zu konvertieren. Die Standardimplementierung gibt eine leere Zeichenfolge für Nullwerte oder die Standard- String-Darstellung des Werts zurück.

In Ihrem Fall sollte es so etwas wie das sein:

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

diese Methode hinzufügen, wird die AutoCompleteTextView erlaubt korrigiert Hinweise zu liefern (im Querformat) anstelle von Objektreferenzen oder Standard toString