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.
- Cómo obtener un problema al comprobar la casilla de verificación generada dinámicamente a través de la vista de lista
- Android: vinculación de datos de una base de datos a un CheckBox en un ListView?
- Cómo obtener la altura del teclado cuando la actividad creada en android
- Android ListView con estilo como iPhone agrupado UITableView
- Reiniciar el contador después de hacer clic en el botón
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 puedo ajustar un número exacto de elementos ListView en la pantalla?
- Cómo actualizar algunos datos en un ListView sin utilizar notifyDataSetChanged ()?
- Las extensiones de vínculo se pierden de la conversión de ListView
- ¿Cómo el ajuste baselineAligned a false mejora el rendimiento en LinearLayout?
- SetOnFocusChangeListener: desencadena después de cada carácter
- EditarTexto en un ListView
- ¿Cómo puedo configurar onClickListener en ArrayAdapter?
- ¿Hay alguna manera de saber cuántos elementos están mostrando en una vista de lista?
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
- Captura de fotos La intención causa NullPointerException en los teléfonos Samsung solamente
- Presione las teclas con android