Edittext Loses Content on Scroll in Listview

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



Leave a reply



Submit