TextWatcher springt nicht an

kurztipp

Aktives Mitglied
Hallo,

ich kämpfe nach wie vor mit dem ListView, das durch einen SimpleCursorAdapter gefüllt wird. Jetzt geht es darum, Daten aus einem EditText bei/nach Benutzereingabe abzurufen. Das wollte ich über ein TextWatcher machen.

Wenn in das EditText etwas geschrieben wird, sollen sich die Daten in einem TextView ändern (simple Multiplikation mit vorgegebenem Wert). Das funktioniert mit dem TextWatcher aber nur halb und unzufriedenstellend -- mit anderen Worten: gar nicht.

Java:
private final TextWatcher mTextWatcher = new TextWatcher() {

	@Override
	public void onTextChanged(CharSequence s, int start, int before,
			int count) {
		log("onTextChanged");

		log(s);
	}

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {
		log("beforeTextChanged");
	}

	@Override
	public void afterTextChanged(Editable s) {
		log("afterTextChanged");
	}
};

//...

mAdapter.changeCursor(cursor);

setListAdapter(mAdapter);

for (int i = 0; i < mAdapter.getCount(); i++) {
	EditText edit = (EditText) mAdapter.getView(i, null, getListView())
			.findViewById(R.id.F_DI_ET_amount);

	edit.addTextChangedListener(mTextWatcher);
	edit.getEditableText().insert(0, "50"); // funktioniert
}

EditText edit = ((EditText) mAdapter.getView(0, null, getListView())
		.findViewById(R.id.F_DI_ET_amount));
edit.getEditableText().insert(0, "100"); //funktioniert nicht

Ich erhalte in der for-Schleife das EditText, das in der jeweiligen Reihe ist. Der erste insert() Aufruf funktioniert und wird an den Listener übergeben. Der Zweite, warum auch immer, funktioniert nicht. Ebensowenig werden Benutzereingaben an den Listener weitergegeben.

Es scheint, als ob der TextWatcher von den EditTexts direkt nach der for-Schleife wieder gelöscht wird.

Wo liegt der Fehler?
 
Zuletzt bearbeitet:

dzim

Top Contributor
Das der TextWatcher gelöscht wird, glaube ich nicht. Was passiert denn, wenn du als Person - als nicht über den Code - etwas eingibst?

BTW: Ich finde den TextWatcher in Android echt s******e. Man muss teilweise Umstände machen, wenn er mal temporär nicht "zuhören" soll. Ich verstehe auch nicht, dass es ausgerechnet hier möglich ist, mehr als einen Listener anzuhängen... Wozu?
 

kurztipp

Aktives Mitglied
Hallo,

Das der TextWatcher gelöscht wird, glaube ich nicht. Was passiert denn, wenn du als Person - als nicht über den Code - etwas eingibst?
Gar nichts passiert. Ich kann etwas eingeben, das steht dann auch im EditText, aber das wars auch schon. Die Listener machen gar nichts, weil sie offensichtlich nicht angesprochen werden.

Gruß
 

dzim

Top Contributor
Ich denke, es werden einfach die "falschen" angesprochen. Mache es anders und hänge die Listener bereits im Adapter an die EditText-Felder. Also in der getView- (oder bindView-) Methode (je nachdem, was du nutzt). Teste mit einer generischen Implementierung mal, ob es klappt (was ich glaube!) und dann mach dir Gedanken, wie du die Daten aus den Adapter raus bekommst... War das in etwa verständlich?
 

kurztipp

Aktives Mitglied
Hallo,

Ich denke, es werden einfach die "falschen" angesprochen.
Ja, es wurden scheinbar die falschen angesprochen, auch wenn ich absolut nich navollziehen kann, welche und wieso.

Mache es anders und hänge die Listener bereits im Adapter an die EditText-Felder. Also in der getView- (oder bindView-) Methode (je nachdem, was du nutzt).
Das hat weitergeholfen. Ich habe mich von dem Ansatz verabschiedet, keinen eigenen Adapter zu implementieren und bin dem Ansatz dieses Tutorials gefolgt und habe einen privaten Adapter implementiert, der nur
Code:
getView()
überschreibt und den TextWatcher implementiert und setzt:
Java:
private class CustomCursorAdapter extends SimpleCursorAdapter {

	Context mContext;

	public CustomCursorAdapter(Context context, int layout, Cursor c,
			String[] from, int[] to, int flags) {
		super(context, layout, c, from, to, flags);

		mContext = context;
	}

	@Override
	public View getView(int position, View view, ViewGroup parent) {
		EditText edit;

		view = super.getView(position, view, parent);
		edit = (EditText) view.findViewById(R.id.edit);
		edit.addTextChangedListener(new MyTextWatcher(view));
		edit.setTag(mObjectList.get(position));

		Cursor cursor = super.getCursor();
		cursor.moveToPosition(position);
		bindView(view, mContext, cursor);

		return view;

	}

	private class MyTextWatcher implements TextWatcher {

		private View mView;

		private MyTextWatcher(View view) {
			mView = view;
		}

		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {
			// do nothing
		}

		public void onTextChanged(CharSequence s, int start, int before,
				int count) {
			// do nothing
		}

		public void afterTextChanged(Editable s) {

			EditText edit = (EditText) mView
					.findViewById(R.id.edit);
			Object object = (Object) edit.getTag();

			object.doSomething(s.toString());
			mAdapter.notifyDataSetChanged();
			log(edit.requestFocus());
		}
	}
}

Das funktioniert so weit auch alles wunderbar! Das einzige Problem, das ich habe, ist, dass
Code:
notifiyDataSetChanged()
dem EditText den Fokus enzieht und man daher immer nur eine Ziffer eingeben kann. Das ist äußerst unkomfortabel, denn das bedeutet: Zahl eingeben -> ListView aktualisiert sich -> Fokus weg -> in EditText klicken -> nächste Zahl usw, also jedes mal manuell wieder den Fokus herstellen.
Leider verschafft
Code:
edit.requerstFocus()
keine Abhilfe, obwohl es
Code:
true
zurückgibt.

Gruß
 

dzim

Top Contributor
Dann mach doch diese Operation erst, wenn Enter oder so gedrückt wurde. [c]notifyDataSetChanged[/c] macht . glaube ich - auch einen relativ teuren Refresh auf der ganzen Liste. Bei kleinen Listen ist das ok, bei großen aber eher Overkill!

Oder bau irgendeinen Timer ein: Wenn x Sekunden nichts gemacht wurde, dann führe die Operationen durch, ansonsten setze den Timmer wieder zurück.

Mir stellt sich gerade noch die Frage: Geht es auch ohne den [c]notifyDataSetChanged[/c]? Brauchst du den um irgend etwas in der Liste anhand dieser Daten anzupassen? Wenn ja, dann verstehe ich es durchaus...
 

dzim

Top Contributor
Ach so noch ein Nachtrag zu vorangegangenen Post: Ich denke der Grund, warum dein erster Ansatz nicht geklappt hat, ist am Ende recht einfach: Du wirst im getView immer einen neuen View inflaten und zurückgeben! Warum mir das nicht schon neulich eingefallen ist! Eine Lösung wäre eine Map von Item auf View innerhalb der Implementierung des Adapters gewesen.
 

kurztipp

Aktives Mitglied
Hallo,

Dann mach doch diese Operation erst, wenn Enter oder so gedrückt wurde. [c]notifyDataSetChanged[/c] macht . glaube ich - auch einen relativ teuren Refresh auf der ganzen Liste. Bei kleinen Listen ist das ok, bei großen aber eher Overkill! [...]

Mir stellt sich gerade noch die Frage: Geht es auch ohne den [c]notifyDataSetChanged[/c]? Brauchst du den um irgend etwas in der Liste anhand dieser Daten anzupassen? Wenn ja, dann verstehe ich es durchaus...
Die Aktualisierung brauche ich, aber bisher nur innerhalb des Datensets. Habs daher anders gelöst. Hatte mit dem Aufruf von [c]notifyDataSetChanged[/c] einen falschen bzw zu komplizierten Ansatz gewählt.
Ich habe ja innerhalb der TextWatcher Implementierung eine Referenz die View, die das Datenset enthält. Also hab ich einfach die korrespondierenden Views (
Code:
findViewById()
) gleich mit aktualisiert -- [c]notifyDataSetChanged[/c] entfällt (wird auch in dem o.g. Link so gehandhabt).

Dass eine gänzlich neue Liste erzeugt wird, habe ich mir auch bereits gedacht. Dann wäre die Referenz auf EditText veraltet und der Focus request zwar erfolgreich, aber nutzlos, so wies auch tatsächlich ist.

Oder bau irgendeinen Timer ein: Wenn x Sekunden nichts gemacht wurde, dann führe die Operationen durch, ansonsten setze den Timmer wieder zurück.
Guter Ansatz, ist evtl für anderes oder andere Interessant.

Gruß
 
Zuletzt bearbeitet:

kurztipp

Aktives Mitglied
Hallo,

ja habe ich. Nachdem ich mir den Sourcecode der getView Methode beim Implementieren genauer angeschaut habe, ist mir das dann im Nachhinein auch aufgefallen, aber auf das Problem hab ichs vor Deinem Post noch nicht bezogen gehabt :D
Ich finde das Verhalten bzw die Namensgebung ein wenig irreführend, da es (zumindest mir) suggeriert hat, man bekommt dadurch Zugriff auf ein Datenset des Adapters.

Gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C getSelectedRow() springt bei JButton-Auswahl nicht weiter mit Frameworks - Spring, Play, Blade, Vaadin & Co 16
G HILFE Dringend switch case springt nicht raus Frameworks - Spring, Play, Blade, Vaadin & Co 23
L Mauszeiger springt in obere linke Ecke des JDialogs Frameworks - Spring, Play, Blade, Vaadin & Co 3
D Button springt aus Textbox Frameworks - Spring, Play, Blade, Vaadin & Co 2
A Debugger springt in andere Klassen Frameworks - Spring, Play, Blade, Vaadin & Co 14
K Figur Springt nicht Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Zeitmessung springt vorraus und funktioniert nicht! Frameworks - Spring, Play, Blade, Vaadin & Co 4
P Spieler im 2D-Spiel springt herum Frameworks - Spring, Play, Blade, Vaadin & Co 0
G JTable springt (JScrollPane, GridBagLayout) Frameworks - Spring, Play, Blade, Vaadin & Co 1
T JTable + JScrollePane Größe "springt" beim resizen des Fensters Frameworks - Spring, Play, Blade, Vaadin & Co 4
engelsteufelin Taschenrechner springt an Start nach falscher Eingabe Frameworks - Spring, Play, Blade, Vaadin & Co 7
W Java Applet aus der Taskleiste springt in Vordergrund Frameworks - Spring, Play, Blade, Vaadin & Co 3
O Progressbar 'springt nicht an' Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Exception springt nicht in den catch- Block Frameworks - Spring, Play, Blade, Vaadin & Co 14
R Programm springt nicht in if Bedingung Frameworks - Spring, Play, Blade, Vaadin & Co 9
F Debugging springt nicht in Methode - liefert null Frameworks - Spring, Play, Blade, Vaadin & Co 2
C LWUIT: Scrollen der Form springt am Ende Frameworks - Spring, Play, Blade, Vaadin & Co 0
Haave Animation "springt" trotz Wartebefehl Frameworks - Spring, Play, Blade, Vaadin & Co 3
J Eclipse springt nicht mehr an. Frameworks - Spring, Play, Blade, Vaadin & Co 8
nrg Debugger springt immer in Java SE Code Frameworks - Spring, Play, Blade, Vaadin & Co 3
D Methode springt zwischen returns Frameworks - Spring, Play, Blade, Vaadin & Co 2
Balbes JComboBox springt af den ersten Wert zurück Frameworks - Spring, Play, Blade, Vaadin & Co 6
Z JList "springt" Frameworks - Spring, Play, Blade, Vaadin & Co 5
H Spring Boot Applikation und JHM Benchmark sowie ContextConfiguration in H2 Tests ich bekomme es nicht hin Frameworks - Spring, Play, Blade, Vaadin & Co 2
thor_norsk Javac nicht vorhanden in Java-17-openjdk-amd64 Frameworks - Spring, Play, Blade, Vaadin & Co 8
R OAuth: Bekomme die E-Mail-Adresse des Benutzers nicht Frameworks - Spring, Play, Blade, Vaadin & Co 3
8u3631984 Spring 2.7.8 Info Enpoint nicht zuerreichen Frameworks - Spring, Play, Blade, Vaadin & Co 1
gradlew.bat spring-boot:run funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
D Primefaces: BlockUI blockt nicht Frameworks - Spring, Play, Blade, Vaadin & Co 0
Zrebna SpringBoot: Einfache RestAPI konsumieren gelingt nicht. Frameworks - Spring, Play, Blade, Vaadin & Co 6
Zrebna Thymeleaf: Wieso Dropdown-Menu nicht ausklappbar? Frameworks - Spring, Play, Blade, Vaadin & Co 1
Zrebna Spring - Thymeleaf: Wieso wird gem. Fallunterscheidung entsprechende View nicht geladen? Frameworks - Spring, Play, Blade, Vaadin & Co 3
8u3631984 Beim WebMVC Test wird Resource File nicht gefunden. Frameworks - Spring, Play, Blade, Vaadin & Co 1
R Warum soll man einen User nicht nur mit einem Session identifizieren? Frameworks - Spring, Play, Blade, Vaadin & Co 0
Zrebna Vaadin: ToolbarButton - Breite für Caption reicht nicht aus. Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Mapstruct Dependency Injection funktioniert nicht mit Spring Frameworks - Spring, Play, Blade, Vaadin & Co 15
OnDemand JsonInclude NON_NULL funktioniert nicht bei String? Frameworks - Spring, Play, Blade, Vaadin & Co 4
Zrebna Vaadin: Falls ToolbarButton nicht enabled ist, dann nicht klickbar? Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand SpringBoot Logrotation funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 eureka server in Gradle Projekt kann Methoden nicht finden Frameworks - Spring, Play, Blade, Vaadin & Co 5
Robertop Springboot Server kann Jakarta Persistence Root nicht installieren? Frameworks - Spring, Play, Blade, Vaadin & Co 0
JanKrieger05 Validierung vom nested Objekt funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 0
OnDemand Spring+Vaadin App startet nicht Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Spring Repo speichert, aber es kommt in der DB nicht an Frameworks - Spring, Play, Blade, Vaadin & Co 3
8u3631984 Spring Boot im Docker Container - Logback wird nicht verwendet Frameworks - Spring, Play, Blade, Vaadin & Co 13
pkm Custom-css in Vaadin greift nicht. Frameworks - Spring, Play, Blade, Vaadin & Co 1
S Spring - Zugriff auf Modellattribute in JPA funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Vaadin Loading Spinner zeigt es nicht an Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Twitter4j findet Klasse nicht (Maven/Intellij) Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Zuul -Eureka - Services nicht gefunden 404 obwohl online Frameworks - Spring, Play, Blade, Vaadin & Co 0
Avalon CSS Datei wird in Spring Boot mit Thymeleaf im Standardordner nicht gefunden Frameworks - Spring, Play, Blade, Vaadin & Co 3
8u3631984 Spring Test findet Component nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
S Spring Boot startet nicht Frameworks - Spring, Play, Blade, Vaadin & Co 3
tom.j85 SpringBoot Rest-Application funktioniert nicht - Keine Fehlermeldungen Frameworks - Spring, Play, Blade, Vaadin & Co 13
F spring apllication startet nicht, ports werden verwednet Frameworks - Spring, Play, Blade, Vaadin & Co 12
S Spring JPA / Hibernate: save Methode arbeitet nicht Frameworks - Spring, Play, Blade, Vaadin & Co 2
R Spring Data: Hibernate liest nicht alle Ebenen Frameworks - Spring, Play, Blade, Vaadin & Co 5
robinab JavaFX + Spring4: fxml findet Controller nicht mehr Frameworks - Spring, Play, Blade, Vaadin & Co 11
D Spring Boot Controller kann nicht bei jedem Request erreicht werden Frameworks - Spring, Play, Blade, Vaadin & Co 7
Z Springboot - Hauptklasse nicht gefunden Frameworks - Spring, Play, Blade, Vaadin & Co 5
A RadioButtons springen nicht automatisch auf false Frameworks - Spring, Play, Blade, Vaadin & Co 3
Psypsy Spring Boot mit JSF bekomme ich nicht zum laufen Frameworks - Spring, Play, Blade, Vaadin & Co 0
H spring jpa eclipselink - extern geänderte Daten werden nicht gelesen Frameworks - Spring, Play, Blade, Vaadin & Co 1
S Spring MVC Rest Multipart Upload funktioniert nicht! Frameworks - Spring, Play, Blade, Vaadin & Co 1
T Gibt es einen Grund nicht Spring zu verwenden? Frameworks - Spring, Play, Blade, Vaadin & Co 5
C Spring findet Bean nicht Frameworks - Spring, Play, Blade, Vaadin & Co 0
S Spring Data JPA - Repositories werden nicht injected Frameworks - Spring, Play, Blade, Vaadin & Co 2
Y Liferay + Spring + Spring Mvs -> @Autowired geht nicht Frameworks - Spring, Play, Blade, Vaadin & Co 0
J Spring AOP "aop:config" nicht gefunden Frameworks - Spring, Play, Blade, Vaadin & Co 0
M Spring DI funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 1
P Spring JDBC bekomme ich nicht zum laufen Frameworks - Spring, Play, Blade, Vaadin & Co 2
R Spring kann Bean über Konstruktor nicht erstellen Frameworks - Spring, Play, Blade, Vaadin & Co 9
M findet Spring bundles nicht? Frameworks - Spring, Play, Blade, Vaadin & Co 0
G Spring XFire finde WSDL nicht Frameworks - Spring, Play, Blade, Vaadin & Co 2
J spring kann eine bean nicht erzeugen Frameworks - Spring, Play, Blade, Vaadin & Co 2
T Spring-Transaktion wird nicht gestartet per Annotation ("no transaction is in progress") Frameworks - Spring, Play, Blade, Vaadin & Co 5
A Spring MVC / JSP und Defaultwerte für nicht ausgefüllte Textfelder Frameworks - Spring, Play, Blade, Vaadin & Co 0
Y Spring - @Autowired funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 12
A JSF mit Spring Web Flow: Flow wird nicht gestartet Frameworks - Spring, Play, Blade, Vaadin & Co 2
I Spring Security 404 Fehler bei Login -> Findet Seite nicht Frameworks - Spring, Play, Blade, Vaadin & Co 0
S Direkt zur Methode springen die in der Klasse und nicht im Interface implementiert? Frameworks - Spring, Play, Blade, Vaadin & Co 4

Ähnliche Java Themen

Neue Themen


Oben