Android AutoCompleteTextView mit Filterung des benutzerdefinierten Adapters funktioniert nicht
Habe ich die Custom CustomerAdapter
public class CustomerAdapter extends ArrayAdapter<Customer> {
private final String MY_DEBUG_TAG = "CustomerAdapter";
private ArrayList<Customer> items;
private int viewResourceId;
public CustomerAdapter(Context context, int viewResourceId, ArrayList<Customer> items) {
super(context, viewResourceId, items);
this.items = items;
this.viewResourceId = viewResourceId;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(viewResourceId, null);
}
Customer customer = items.get(position);
if (customer != null) {
TextView customerNameLabel = (TextView) v.findViewById(R.id.customerNameLabel);
if (customerNameLabel != null) {
customerNameLabel.setText(String.valueOf(customer.getName()));
}
}
return v;
}
}
sowie customer_auto
layout
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/customerNameLabel"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:padding="10dp" android:textSize="16sp"
android:textColor="#000">
</TextView>
und auf meine public void onCreate
AutoCompleteTextView customerAutoComplete = (AutoCompleteTextView) findViewById(R.id.autocomplete_customer);
CustomerAdapter customerAdapter = new CustomerAdapter(this, R.layout.customer_auto, customerList);
customerAutoComplete.setAdapter(customerAdapter);
und Customer.java
public class Customer implements Parcelable {
private int id;
private String name = "";
public Customer() {
//TODO Auto-generated constructor stub
}
/**
* This will be used only by the MyCreator
*
* @param source
*/
public Customer(Parcel source) {
/*
* Reconstruct from the Parcel
*/
id = source.readInt();
name = source.readString();
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@Override
public Customer createFromParcel(Parcel source) {
return new Customer(source);
}
@Override
public Customer[] newArray(int size) {
return new Customer[size];
//TODO Auto-generated method stub
}
};
@Override
public String toString() {
return this.name;
}
}
Aber die auto-suggest-Feld nicht filtern korrekt. für zB, wenn ich die Art an
im test-box Kunden, beginnend mit br
zeigen!
InformationsquelleAutor der Frage Mithun Sreedharan | 2012-01-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich zu over-ride die getFilter() Methode der Adapter
Hier ist der code, der arbeitete für mich, Dank sacoskun
InformationsquelleAutor der Antwort Mithun Sreedharan
Dies ist meine Lösung. Ich fühle mich wie es ein bisschen sauberer (nicht mit 3 separaten, verwirrend ArrayLists) als die akzeptiert man, und hat mehr Optionen.
Hier ist, was ich gearbeitet habe, nach ein bisschen von Versuch und Irrtum. Es sollte funktionieren, selbst wenn der Benutzer die Rücktaste, weil Sie nicht entfernen Sie die original-Einträge aus
mCustomers
:InformationsquelleAutor der Antwort Carl Anderson
Statt überschreiben
getFilter()
Methode in-adapter wir einfach außer Kraft setzen könnentoString()
Benutzer-definierte Objekt (Kunde).In
toString()
nur wieder das Feld basiert auf, was Sie brauchen, zu filtern. Es funktionierte für mich.In meinem Beispiel bin ich das filtern nach Namen:
InformationsquelleAutor der Antwort kavinraj M
Im obigen code
publisHResults()
Methode gibt das concurrent modification exception....wir ändern den code wie:
InformationsquelleAutor der Antwort Shivani Sangewar
Vielleicht ist das zu spät ist, brauchen Sie nicht zu überschreiben, alle diese Funktionen , die nur die Funktion zu überschreiben, ist :
halte ich ändern :
achten, sollten Sie sich nicht deklarieren neuen ListItems,
weil ArrayAdapter arbeitet mit seinen eigenen mObjects, und filtern Sie diese Liste nicht Ihre Artikel-Liste,
So sollten Sie verwenden getItem-Funktion, um auf Elemente zuzugreifen.
dann gibt es keinen Grund zu schreiben, Ihre ArrayFilter.
InformationsquelleAutor der Antwort Mehrdad Faraji
Ich weiß nicht, wo Sie das abrufen der getResult. Ich denke, die Lösung ist in diesem Fall für nicht die gleichzeitige änderung:
InformationsquelleAutor der Antwort Jachumbelechao Unto Mantekilla
Ich hoffe, dass dieser Beitrag wird Ihnen helfen, Menschen bei der Umsetzung eines ähnlichen benutzerdefinierten Funktionen in der Zukunft. Ich basiert diese auf meine version des Adapters für die Darstellung von tag-Vorschläge in meine microblogging-app:
Erweitern ArrayAdapter weniger boilerplate code. Die Umsetzung Filterbaren zu ändern filter-Verhalten später.
Grundsätzlich im Konstruktor müssen Sie übergeben eine Liste angezeigt wird, zunächst, es werde später eine Liste mit gefilterten Ergebnisse (dies ist auch ein Verweis auf eine Liste, die berücksichtigt werden, wenn die Berufung notifyDataSetChanged()) und natürlich eine Liste, auf die Sie sich stützen können-Filterung (allTags in meinem Fall). Ich bin auch vorbei Kontext für layout inflation in der getView().
Oben sehen Sie eine einfache Ansicht Halter pattern, mit ein wenig Hilfe von Butterknife aufblasen, um eine benutzerdefinierte Zeile layout.
Dies ist die am wenigsten boilerplate-code, den ich schreiben könnte. Ihre einzige Sorge ist die Methode
filterTagSuggestions
, sollte die Rückkehr einer gefilterten Liste von tags, die basierend auf dem input der Nutzer (CharSequence constraint
). Hoffe, zusammengefasst und organisiert notwendige info ein wenig.InformationsquelleAutor der Antwort matdziu
Habe ich nicht-update und ändern orginal Liste Fragen von oben beantworten. Ich fixe das problem mit diesen codes.
Dies ist die wichtigste Linie für nicht-update und ändern der orginal Liste Problem:
Besonders diejenigen
super(ActivityContext, ResourceID, TextViewResourceID, new ArrayList());
Ich hoffe, diese Lösung wird Ihnen helfen 🙂
InformationsquelleAutor der Antwort Abdulkadir NURKALEM
Wenn Sie ConcurrentModificationException Ausnahme.
Ersetzen ArrayList mit der thread-sicheren Klassen CopyOnWriteArrayList.
Hier finden Sie detatils.
https://examples.javacodegeeks.com/java-basics/exceptions/java-util-concurrentmodificationexception-how-to-handle-concurrent-modification-exception/
InformationsquelleAutor der Antwort Zoltán Buzás