Android: EditText pierde contenido en desplazamiento en ListView?

Tengo el artículo de la lista con EditText en él, no sé cuántos artículos habrá. Tengo un problema cuando EditText un texto en EditText , y luego desplácese hacia abajo de un ListView , después de haber desplazado hacia arriba de nuevo no hay texto en mi primer EditText , o hay algún texto de otro EditText de ListView .

He intentado TextWatcher , y el ahorro de datos a la matriz, pero los problemas es que la posición devuelta de vista en ListView no siempre es la derecha, así que perdí algunos datos de la matriz.

Por favor ayuda.

Aquí está mi código:

 public class EfficientAdapter extends BaseAdapter { private LayoutInflater mInflater; public String[] Current; ArrayList<String> MeterName, PreviousReading, Current_Reading; JSONArray getArray_Meter_Reading; 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(); } } } 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; 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); 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(); } }); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } 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)); return convertView; } class ViewHolder { TextView adp_MeterName, adp_Previous; EditText adp_Current; int ref; } } 

prueba esto:

 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; } } 

Aquí he incluido un objeto de HashMap que mantendrá un ojo si EditText contiene el valor o no. Y cuando usted rueda el listview, será rendido otra vez llamando su método del getView junto con el texto asociado con cada edittext.

En este código, cuando se carga por primera vez listview, todo su edittext será sin texto. Una vez que ingrese algún texto, se anotará en myList.So cuando vuelva a mostrar la lista, su texto sería impedido.

Una cosa más, debe implementar textwatcher fuera si (convertView == null) .. else .. block.That es una mejor práctica!

Estaba teniendo el mismo problema con un proyecto en el que estaba trabajando. Todas las soluciones que había encontrado también mencionó usando el textChangeListener , sin embargo debido a la naturaleza de la lista, y con un EditText en cada vista de fila, esto era muy ineficiente. Tomé un acercamiento separado usando el EditText.setOnFocusChangeListener() .

Adjunto esto a cada EditText dentro del método getView. La razón de esto funciona tan bien es que se llama cuando el usuario cambia a un edittext diferente o se desplaza por lo que la fila actual está fuera de la pantalla que hace que el EditText perder el foco.

En el onFocusChange (View v, boolean hasFocus) dentro del listener simplemente pongo:

 if (!hasFocus) { EditText et = (EditText) v.findViewById(R.id.groupAmount); data.get(position).put("dueAmount", et.getText().toString().trim()); } 

En mi ejemplo, estoy almacenando el valor introducido en mis datos utilizados para rellenar las vistas en cada llamada getView, pero esto debe mostrar cómo acceder a los datos que el usuario ingresó. Sólo asegúrese de que intenta tomar estos datos almacenados y tratar de poblar el editText en la posición correspondiente.

Espero que esto ayude.

Publicar mi adaptador completo aquí para referencia

 public class memberlistadapter extends BaseAdapter { private LayoutInflater mInflater; public ArrayList<Hashtable<String, String>> data; ViewHolder viewHolder; public static HashMap<Integer,String> myList=new HashMap<Integer,String>(); public memberlistadapter(Context context) { mInflater = LayoutInflater.from(context); } public memberlistadapter(Activity activity, ArrayList<Hashtable<String, String>> objects) { super(); mInflater = activity.getLayoutInflater(); //this.activity = activity; this.data = objects; Log.d("data", data.toString()); } public void clear() { this.data.clear(); viewHolder = null; } public void setData(ArrayList<Hashtable<String, String>> data) { this.data = data; } public int getCount() { return data.size(); } public Object getItem(int item) { return data.get(item); } public long getItemId(int position) { return position; } public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.member_amount_child, null); viewHolder = new ViewHolder(); viewHolder.nameText = (TextView) convertView.findViewById(R.id.grp_amt_child); viewHolder.amountText = (EditText) convertView.findViewById(R.id.groupAmount); viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.memberCheckNotif); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } //Log.d("data at "+position, data.get(position).toString()); String amt = data.get(position).get("dueAmount"); String name = data.get(position).get("name"); String check = data.get(position).get("reminder"); viewHolder.nameText.setText(name); try { if (amt.length() > 0 && !amt.equalsIgnoreCase("0")) { viewHolder.amountText.setText(amt); } else { viewHolder.amountText.setText(""); } } catch (Exception e) { viewHolder.amountText.setText(""); } viewHolder.amountText.setOnFocusChangeListener(new View.OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { EditText et = (EditText) v.findViewById(R.id.groupAmount); data.get(position).put("dueAmount", et.getText().toString().trim()); } } }); try { if (check.equalsIgnoreCase("true")) { viewHolder.checkBox.setChecked(true); } else { viewHolder.checkBox.setChecked(false); } } catch (Exception e) { viewHolder.checkBox.setChecked(false); } viewHolder.checkBox.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (((CheckBox) v).isChecked()) { data.get(position).put("reminder", "True"); } else { data.get(position).put("reminder", "False"); } } }); if (position == 0) { viewHolder.checkBox.setVisibility(View.GONE); viewHolder.amountText.setVisibility(View.GONE); viewHolder.nameText.setVisibility(View.GONE); } else { viewHolder.checkBox.setVisibility(View.VISIBLE); viewHolder.amountText.setVisibility(View.VISIBLE); viewHolder.nameText.setVisibility(View.VISIBLE); } return convertView; } static class ViewHolder { TextView nameText; EditText amountText; CheckBox checkBox; } } 

Tal vez usted puede probar esto o ver a la derecha la sección de publicaciones relacionadas

EditText pierde contenido en desplazamiento en ListView

  • La adición de una vista crea un ListView dentro de un fragmento para actualizar
  • ListView con el título
  • El efecto Ripple no va por encima de ImageView
  • Cómo utilizar la funcionalidad de búsqueda en la vista de lista personalizada en Android
  • ¿Por qué establecer setBackgroundColor no funciona en mi lista personalizada?
  • SetOnItemClickListener en ListView no se dispara
  • Android ListView actual ubicación de desplazamiento Y píxeles
  • Cómo quitar el borde en un ListView?
  • Android: onScrollStateChanged SCROLL_STATE_IDLE a veces no se dispara
  • No se puede cargar una imagen desde la URL
  • Lista de elementos con colores alternos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.