EditText loses content on scroll in ListView?
try this:
public class EfficientAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public String[] Current;
ArrayList<String> MeterName, PreviousReading, Current_Reading;
JSONArray getArray_Meter_Reading;
public static HashMap<Integer,String> myList=new HashMap<Integer,String>();
public EfficientAdapter(Context context, JSONArray getArray_Meter_Reading) {
mInflater = LayoutInflater.from(context);
this.getArray_Meter_Reading = getArray_Meter_Reading;
MeterName = new ArrayList<String>();
PreviousReading = new ArrayList<String>();
for (int i = 0; i < getArray_Meter_Reading.length(); i++) {
try {
String Meter_Name = getArray_Meter_Reading.getJSONObject(i)
.getString("MeterName").toString();
String previous_Meter_Reading = getArray_Meter_Reading
.getJSONObject(i).getString("PrevMeterReading")
.toString();
MeterName.add(Meter_Name);
PreviousReading.add(previous_Meter_Reading);
// Meter[i]=MeterName.get(i);
// Previous[i]=PreviousReading.get(i);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// initialize myList
for(int i=0;i<JSON_ARRAY_LENGTH;i++)
{
myList.put(i,"");
}
}
public int getCount() {
return getArray_Meter_Reading.length();
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
final int pos=position;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.meter_reading_list, null);
holder = new ViewHolder();
holder.adp_MeterName = (TextView) convertView
.findViewById(R.id.txt_Meter_Name);
holder.adp_Previous = (TextView) convertView
.findViewById(R.id.txt_Previous);
holder.adp_Current = (EditText) convertView
.findViewById(R.id.ed_Current);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.adp_Current.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start,
int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
// TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
Current[holder.ref] = s.toString();
myList.put(pos,s.toString.trim());
}
});
holder.ref = position;
holder.adp_MeterName.setText(MeterName.get(position));
holder.adp_Previous.setText(PreviousReading.get(position));
// holder.adp_Current.setHint(MeterName.get(position));
// holder.adp_Current.setText(PreviousReading.get(position));
holder.adp_Current.setText(myList.get(position));
return convertView;
}
class ViewHolder {
TextView adp_MeterName, adp_Previous;
EditText adp_Current;
int ref;
}
}
Here I have included a HashMap object which will keep an eye on if EditText contains value or not.And when you scroll the listview,it will be rendered again by calling its getView method along with the text associated with each edittext.
In this code,when you firstly load listview,all your edittext will be with no text.once you enter some text,it will be noted in myList.So when you again render the list,your text would be prevented.
One more thing,you should implement textwatcher outside if(convertView==null)..else.. block.That's a better practice!
EditText in ListView loses content in scrolling
You need to store data in afterTextChanged as same object as you set in text
holder.friendName.setText(myFriends.get(position).getName());
//Edit Text Listeners:-
holder.editText.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) {
}
@Override
public void afterTextChanged(Editable s) {
myFriends.get(position).setName(s.toString);
}
});
EditText loses value when scrolling ListView android
I assume you are aware that you are reusing the views in the ListView
using the convertView
-- reusing the same views that go off the screen for the views that enter the screen.
i see that the last item of listview is filled automatically
That might be because that view has been reused from another view where you have entered some text in the EditText
.
and also when i scrolling up, the first item loses its values.
The same reason as above. Some other view is being reused in this position.
Solution:
Save the user entered text in a List of some model objects. For example, like this ArrayList<MyData>
. The MyData
object has the typed text. And the List has one object for each item in your list.
Now in the getView
callback get the text from the ArrayList<MyData>
for the corresponding position and set it to the EditText
.
List view edittext data loses on scrolling in Android
Add the listeners to the ViewHolder
private class ViewHolder {
TextView textView;
EditText editQty;
EditText editprice;
TextWatcher qtyWatcher;
TextWatcher priceWatcher;
int ref;
}
Now in the getView() method remove the existing watches of the edittext , then update the text in the edittext and set the new text watchers.
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
try {
final ViewHolder holder;
// TODO Auto-generated method stub
if (convertView == null) {
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row, null);
holder.textView = (TextView) convertView.findViewById(R.id.rowText);
holder.editQty = (EditText) convertView.findViewById(R.id.qty);
holder.editprice = (EditText) convertView.findViewById(R.id.price);
holder.textView.setTextSize(20);
holder.textView.setTextColor(Color.BLACK);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.ref = position;
if (holder.qtyWatcher != null) {
holder.editQty.removeTextChangedListener(holder.qtyWatcher);
}
if (holder.priceWatcher != null) {
holder.editprice.removeTextChangedListener(holder.priceWatcher);
}
holder.textView.setText(names.get(position));
holder.editQty.setHint("Quantity");
holder.editprice.setHint("Price");
if(position<quantities.size())
holder.editQty.setText(quantities.get(position));
else
holder.editQty.setText("");
if(position<itemPrices.size())
holder.editprice.setText(itemPrices.get(position));
else
holder.editprice.setText("");
holder.qtyWatcher = 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) {
}
@Override
public void afterTextChanged(Editable s) {
//Update the quantity
}
};
holder.editQty.addTextChangedListener(holder.qtyWatcher);
holder.priceWatcher = 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) {
}
@Override
public void afterTextChanged(Editable s) {
//Update you price
}
};
holder.editprice.addTextChangedListener(holder.priceWatcher);
return convertView;
} catch (NumberFormatException ex) {
Toast.makeText(context, "!!!", Toast.LENGTH_SHORT).show();
ex.printStackTrace();
}
return convertView;
}
EditText loses content on scroll in ListView
you should try in this way as below:
if (convertView == null) {
holder = new ViewHolder();
LayoutInflater vi = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.element_in_game, null);
holder.scoreToUpdate = (EditText) convertView
.findViewById(R.id.elementUpdateScore);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//binding data from array list
holder.scoreToUpdate.setText(scoresToUpdate[position]);
holder.scoreToUpdate.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
//setting data to array, when changed
scoresToUpdate[position] = s.toString();
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
return convertView;
}
Explanation:
Recycling behavior of ListView, actually erase all data bind with its Row Item, when go out of vision.
So every new row coming in in vision from whatever direction you need to bind data again.
Also, when EditText text change you have to keep values also in some data structure, so later on again row data binding you can extract data for position.
You can use, array ArrayList for keeping edittext data, and also can use to bind data.
Similar behavior use in Recyclerview Adapter, behind logic you need to know about data binding of row data of adapters.
EditText in ListView loses content in scroll
Created a reference integer in the static ViewHolder that holds the position of clicked item in listview. Then in text watcher i set the string of the item that exists in the viewholder.reference position of my list.
So, static is helping with that job.
The following code is the one that worked!
static class ViewHolder{
TextView FlightTimeTextView;
EditText BusNumberEditText;
int Reference;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if(convertView == null)
{
LayoutInflater inflater = (LayoutInflater) AdapterContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_list_order, parent, false);
holder = new ViewHolder();
holder.FlightTimeTextView = (TextView) convertView.findViewById(R.id.itemFlightTimeTextView);
holder.BusNumberEditText = (EditText) convertView.findViewById(R.id.busNumberEditText);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final Order order = Orders.get(position);
holder.Reference = position;
holder.FlightTimeTextView.setText(order.getFlightTime());
holder.BusNumberEditText.setText(order.getBusNumber());
holder.BusNumberEditText.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) {
}
@Override
public void afterTextChanged(Editable s) {
Orders.get(holder.Reference).setBusNumber(s.toString());
}
});
return convertView;
}
}
Related Topics
How to Get Text on an Actionbar Icon
Android Canvas: Draw Transparent Circle on Image
Lost My Keystore for Uploaded App on Android Market
Android Ci Build: Could Not Find Aapt2-Proto.Jar
Single Selection in Recyclerview
Passing Data Between Activities in Android
Update an Android App (Without Google Play Store Visit)
How to Write Character & in Android Strings.Xml
Android Emulator Error Message: "Panic: Missing Emulator Engine Program for 'X86' Cpus."
Android What Does the Cliptopadding Attribute Do
Edittext, Clear Focus on Touch Outside
Android Studio - Android Emulator Wifi Connected with No Internet
Android Webview with an Embedded Youtube Video, Full Screen Button Freezes Video
How to Simulate :Active CSS Pseudo Class in Android on Non-Link Elements
Illegalargumentexception: Navigation Destination Xxx Is Unknown to This Navcontroller