Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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

  • Cómo definir ColorStateList para TextView?
  • Android AppBarLayout superpone la vista de lista
  • ¿Hay una manera de desactivar / editar el desvanecimiento que una vista de lista tiene en sus bordes?
  • Dibujo de dos trazos para Android ListView divisor?
  • Cómo quitar el borde en un ListView?
  • ¿Crea desplazamiento alfabético fácil en ListView?
  • Cómo obtener los elementos de la lista seleccionada de un Listview con checkBox y Adaptador personalizado?
  • Cómo arrastrar el elemento de lista desplegable a otro ListView
  • 3 Solutions collect form web for “Android: EditText pierde contenido en desplazamiento en ListView?”

    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

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.