I have the list of travelers with custom adapter what consist two EditText - edtFirstName and edtLastName. I want when user enters text save changes to List, and when next butto
Create one more EditText
in the screen that is invisible with name invivisbleEt
.
And do the following thing in the addTextChangedListener
firstNameView.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable editable) {
if(!firstNameView.isFocused())
currentItem.setFirstName(editable.toString());
}
});
Also add this code in the onCreate
method for ListView
object.
lv.setOnScrollListener(new AbsListView.OnScrollListener() {
//public boolean scrolling;
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
invivisbleEt.requestFocus();
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
}
});
in getView method, the parameter position gives the position of the newly created childView, not the clicked childView's position.
use this to get the correct position:
final int actual_position = myList.getPositionForView((View) v.getParent());
in onClick(View v);
of the onClickListener
of any View. In you case, you must implement onTextChangedListener for that EditText.
here:
myList is the ListView
v is the View you clicked, in this case the childView of the parent(myList).
The issue happens because views are reusable (that is by design in Android API). So eventually you may assign more than 1 text watcher to the same text view. And all of the assigned watchers are fired when text inside of the text view is changed.
A quick fix (and non-optimal if the list is really long, say, of 1000+ items) would be to have a map of Traweller -> TextWatcher
.
Then inside of getView() you can do this (pseudo-code):
TextWatcher
for this Traweller
TextWatcher
, put in the map and assign to EditText
TextWatcher
from the EditText
and remove from the mapTextWatcher
, put in the map and assign to EditText