Stringbuilder append to listview and searchview

  • 4 Antworten
  • Neuster Beitrag
N

N3cron

Fortgeschrittenes Mitglied
Threadstarter
Hallo zusammen. Ich hoffe ihr könnt mir weiter helfen.
Ich habe folgendes Problem. Ich lese mit einem XmlPullParser eine Datei ein und gebe sie weiter an printMaFiTool.
In meiner ListView bekomme ich alles einwandfrei angezeigt. Das Problem ist der Textwatcher/Stringbuilder.
Beispiel: Sobald ich im Edittext/Textwatcher suche, funktioniert die Suche nur in der ersten Zeile
MaFiTool.SAPNummer. Darauf hin habe ich so wie aufgelistet mal die Anordnung geändert. Und siehe da ich konnte plötzlich in MaFiTool.Komponente suchen. Also immer nur das was im builder.append an erster Stelle steht. Könnt ihr mir da weiter helfen? Warum ist das so, und wie kann ich es ändern?

builder.append(MaFiTool.SAPNummer + "\n");
builder.append(MaFiTool.Komponente + "\n");
builder.append(MaFiTool.BaBr);

builder.append(MaFiTool.Komponente + "\n");
builder.append(MaFiTool.SAPNummer + "\n");
builder.append(MaFiTool.BaBr);

builder.append(MaFiTool.BaBr);
builder.append(MaFiTool.Komponente + "\n");
builder.append(MaFiTool.SAPNummer + "\n");



private void printMafiTool(ArrayList<MaFiTool> MafiTool) {
progressDialog.dismiss();
ArrayList<String> arr_list = new ArrayList<String>();
for (final MaFiTool MaFiTool : MafiTool) {
StringBuilder builder = new StringBuilder("Selected:\n");
builder.append(MaFiTool.Suchtext + "\n");
builder.append(MaFiTool.SAPNummer + "\n");
builder.append(MaFiTool.Komponente + "\n");
builder.append(MaFiTool.BaBr);
arr_list.add(builder.toString());
}
adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.liste, arr_list);
AnzeigeListe.setAdapter(adapter);
inputSearch.addTextChangedListener(new TextWatcher() {
@override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}
@override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
}
@override
public void afterTextChanged(Editable s) {
}
});
}
 
swa00

swa00

Moderator
Teammitglied
@N3cron

Hallo ,

nun , da du ja schon in SO keine Antwort zu deiner Frage bekommen hast, liegt sehrwahrscheinlich daran , dass kaum einer
etwas mit printMaFiTool anfangen kann. Ich auch nicht.


Zum Thema :
Vielleicht liegt es auch daran, dass du den Textwatcher eher mit einer Structur-ArrayList bedienen solltest,
anstatt mit einem StringBuilder.
Die ArrayList sollte dann vom Typ einer Klasse der Gesamt-Datenstructur sein.

Und im Callback gehst du Diesen dann sequentiell durch.
Bei größeren Datenmengen dann an dieser Stelle einen AsyncTask.

Ergo : Du solltest Dir hier eine eigene Compare-Routine basteln und den Adapter
mit den Ergebnissen neu befüllen. Danach ein Notify auf die Liste.

So wende ich es zumindest ohne Probleme an.
 
Zuletzt bearbeitet:
N

N3cron

Fortgeschrittenes Mitglied
Threadstarter
Morgen. Sorry ich verstehe nicht richtig was du meinst. Ich greife doch mit dem Textwatcher auf eine Arraylist zu oder nicht?
Hier nochmal der Code von dem Begin an wo ich die xml Datei lade. Diese sieht immer inneren so aus. Nur ein kleiner Auszug
Ich möchte in meinem Textwatcher immer das zwischen den <> suchen. Selbst wenn ich die 00100014 zb suche soll der Suchtext und BaBr mit angezeigt werden, da es alles zusammen gehört. Mit dem Stringbuilder wollte ich dann wie dargestellt alles anzeigen, da sonst in meiner ListView alles hintereinander angezeigt wird. "Drahtbürste 3-reihig kurzer Stiel00100014I4110 "
Die xml Datei hat mehrere tausend Zeilen.
Hoffe ich habe es jetzt etwas besser beschreiben können. Ich komme da im moment nicht weiter

<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<MaFi-Tool>
<SAP-Nummer>00100014</SAP-Nummer>
<Suchtext>Drahtbürste 3-reihig kurzer Stiel</Suchtext>
<BaBr>I4110</BaBr>
</MaFi-Tool>



private void parseXML() {
XmlPullParserFactory parserFactory;
try {
parserFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = parserFactory.newPullParser();
InputStream is = getAssets().open("ice3.xml");
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(is, null);
processParsing(parser);
inputSearch.setEnabled(true);

} catch (XmlPullParserException e) {

} catch (IOException e) {
}
}

public class MaFiTool {
public String SAPNummer, Komponente, Suchtext, BaBr;
}

private void processParsing(XmlPullParser parser) throws IOException, XmlPullParserException {
ArrayList<MaFiTool> DocumentElement = new ArrayList<>();
int eventType = parser.getEventType();
MaFiTool mafitool = null;

while (eventType != XmlPullParser.END_DOCUMENT) {
String eltName = null;

switch (eventType) {
case XmlPullParser.START_TAG:
eltName = parser.getName();

if ("MaFi-Tool".equals(eltName)) {
mafitool = new MaFiTool();
DocumentElement.add(mafitool);
} else if (mafitool != null) {
if ("Suchtext".equals(eltName)) {
mafitool.Suchtext = parser.nextText();
} else if ("SAP-Nummer".equals(eltName)) {
mafitool.SAPNummer = parser.nextText();
} else if ("BaBr".equals(eltName)) {
mafitool.BaBr = parser.nextText();
}
}
break;
}
eventType = parser.next();
}
printMafiTool(DocumentElement);

}

private void printMafiTool(ArrayList<MaFiTool> MafiTool) {
progressDialog.dismiss();
ArrayList<String> arr_list = new ArrayList<String>();


for (final MaFiTool MaFiTool : MafiTool) {
StringBuilder builder = new StringBuilder();
builder.append(MaFiTool.Suchtext + System.getProperty("line.separator"));
builder.append(MaFiTool.SAPNummer + System.getProperty("line.separator"));
builder.append(MaFiTool.BaBr);

arr_list.add(builder.toString());

adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.liste, arr_list);
adapter.notifyDataSetChanged();
adapter.setNotifyOnChange(true);
AnzeigeListe.setAdapter(adapter);
}


// Toast.makeText(getApplicationContext(), "Position " + AnzeigeListe, Toast.LENGTH_SHORT).show();

inputSearch.addTextChangedListener(new TextWatcher() {

@override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString());
adapter.notifyDataSetChanged();
adapter.setNotifyOnChange(true);

}

@override
public void afterTextChanged(Editable s) {


}
});
}
 
swa00

swa00

Moderator
Teammitglied
Tobi,

Mit dem Stringbuilder wollte ich dann wie dargestellt alles anzeigen, da sonst in meiner ListView alles hintereinander angezeigt wird.
Dafür solltest du dir aber eher einen CustomAdapter RecycleView erstellen.
(Aber hatten wir das Thema nicht schon einmal ? :) )

Im Prinzip bist du schon fast am Ziel - nur der Stringbuilder gehört nicht hierher und eine
public Ergebniskopie fehlt.

Sorry ich verstehe nicht richtig was du meinst. Ich greife doch mit dem Textwatcher auf eine Arraylist zu oder nicht?
Ja schon ,aber auf einen String , den du mit CRLF und dem Stringbuilder erstellst
Code:
ArrayList<String> arr_list = new ArrayList<String>();
StringBuilder builder = new StringBuilder("Selected:\n");
builder.append(MaFiTool.Suchtext + "\n");
builder.append(MaFiTool.SAPNummer + "\n");
builder.append(MaFiTool.Komponente + "\n");
builder.append(MaFiTool.BaBr);
arr_list.add(builder.toString());
Das geht so nicht, denn jetzt vergleichst du genau auf Diesen.
Das kannst gerne temporär beim compare machen, aber nicht grundsätzlich als Vergleichsparamter.


Step By Step :
a) Du solltest mit einer Kopie deines Ursprung-Stammes arbeiten (MaFiTool nach XML Parse)
b) Im Callback einen eigenen Compare auf deine MafiTool Klassen-Struktur.
c) Das Ergebnis wieder in eine public Result-MafiTool-ArrayList gesetzt und dann dem Adapter übergeben.
d) Danach immer nur noch das jeweilige Ergebnis nehmen und nicht deinen kompletten Ursprungs-Stamm.
Es sei denn, der Nutzer hat gar nichts eingetippt.

Also arbeitest du nur mit einer public Ergebnis-Kopie - sonst erhälst du keine Treffer.
Alleine schon aus dem Grunde , dass sich die Performance dadurch um ein Vielfaches erhöht.
 
Zuletzt bearbeitet:
N

N3cron

Fortgeschrittenes Mitglied
Threadstarter
Ok. Ich hoffe ich habe dich da jetzt richtig verstanden und versuche dies nun umzusetzen.

Vielen Dank!!
 
Oben Unten