Android: EditText en el problema de ListView

Tengo un listview en mi aplicación que es básicamente un cuestionario por lo que hay algunos EditTexts que el usuario tiene que llenar. He encontrado los siguientes problemas:

  1. Algunos de los EditText requieren entrada numérica, por lo que establezca el tipo de entrada en el tipo xml correspondiente como numérico, sin embargo, como cuando hago clic en el EditText el teclado numérico se muestra, pero casi inmediatamente desaparece y el teclado normal se muestra.

  2. Como usted puede imaginarse, necesito almacenar los valores que el usuario introduce en estos EditTexts. El problema que tengo con esto es que después de introducir algún texto en algunos EditTexts y desplácese hacia abajo, el texto se ha ido cuando vuelvo. Usted puede ver en mi código que he hecho un intento para evitar esto y debo mencionar que funciona perfectamente bien con las casillas de verificación.

  3. Al principio estaba teniendo problemas con perder el foco pero lo resolví mirando otras preguntas (añadido descendantFocusablity = "beforeDescendants" al ListView y windowSoftInputMode = "adjustPan"). Funciona bien, excepto que cuando un EditText está por debajo de la mitad de la pantalla pierde el foco tan pronto como empiezo a escribir en él. Método getView para el adaptador de lista:

    public View getView(final int position,View result,ViewGroup parent) { final ViewHolder vh; final Question question = values.get(position); if(holders[position]==null) vh = new ViewHolder(); else vh = holders[position]; LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(question.getQuestionType().equals(Question.TYPE_CLOSED)) { result = inflater.inflate(R.layout.closed_question_list_item, null); vh.cb = (CheckBox)result.findViewById(R.id.checkbox); vh.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { vh.isChecked = isChecked; holders[position] = vh; } }); vh.cb.setChecked(vh.isChecked); } else { result = inflater.inflate(R.layout.numeric_question_list_item, null); vh.et = (EditText)result.findViewById(R.id.question_et); vh.et.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { vh.tvValue = s.toString(); holders[position] = vh; Log.i(TAG,"Entered afterTextChanged for "+ question.getText()); } @Override public void beforeTextChanged(CharSequence s, int start,int count, int after) { } @Override public void onTextChanged(CharSequence s, int start,int before, int count) { } }); vh.et.setText(vh.tvValue); } vh.tv = (TextView)result.findViewById(R.id.question_text); vh.tv.setText(question.getText()); holders[position] = vh; result.setTag(vh); return result; } 

Soluciones para el número 3:

  1. Establezca descendantFocusablity="beforeDescendants" en el listview.

  2. Establecer windowSoftInputMode="adjustPan" en el manifiesto

  3. Establecer listview.setItemsCanFocus(true)

Para expandir la respuesta de aaRBiyecH , aquí hay una solución y una explicación más profunda a sus preguntas # 1 y # 3 ( fuente ):

Debe establecer la propiedad DescendantFocusability de su ListView en "afterDescendants".

Puede hacerlo en el XML de esta manera:

android:descendantFocusability="afterDescendants"

O en código como este:

listview.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)

También es necesario configurar los elementos para que puedan enfocarse.

Puede hacer esto en el código como este: listview.setItemsCanFocus(true) ;

Además, debe especificar lo que está ocurriendo con la ventana principal de su actividad cuando se muestra el teclado virtual. Esto se hace cambiando el atributo WindowSoftInputMode . Es probable que desee establecerlo en AdjustPan para que su lista no se cambia el tamaño y, por tanto, GetView no se vuelve a llamar. Esto es probablemente lo que está sucediendo ahora cuando ocultar el teclado, GetView se llama de nuevo y restablecer el valor original en el EditText.

Puede hacerlo usando el atributo android:windowSoftInputMode="adjustPan" en el XML de su clase de actividad principal o getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_PAN) programación.

Debido a la pregunta 2 se puede relacionar con este post elementos EditText en una lista de desplazamiento perder sus cambios cuando se desplaza fuera de la pantalla por lo que parece no hay una solución fácil para persistir el edittexts cuando se desplaza hacia abajo

Si tu derecho puedes probar

EditText pierde contenido en desplazamiento en ListView

O simplemente se refieren a los puestos relacionados a la derecha

Está funcionando para mí …. Por favor, compruebe esto

 listview.setItemsCanFocus(true); 
  • Android: Cómo recuperar el nombre de archivo y la extensión de un recurso por ID de recurso
  • AndEngine GLES 2 - pantalla en negro, sin errores
  • Cómo manejar una intención SEND silenciosa con una actividad sin cabeza
  • ¿Cómo agregar publicidad Admob en mi aplicación de Android?
  • Intentando agregar un método openFile a React Native, no se puede llamar a getCurrentActivity
  • ¿Cómo agregar desplazamiento a la vista cuando se cambia la orientación de la pantalla a paisaje?
  • ¿Cuál es la diferencia entre `Matrix.setRotate` y` Matrix.postRotate`
  • ¿Cómo habilitar la depuración de SSL en la plataforma Android?
  • Crear SSL-Socket en Android con certificado autofirmado
  • ¿Cómo apoyar idiomas diferentes con datos web dinámicos en Android?
  • ¿Cómo puedo optimizar este código que contiene alguna línea repetitiva?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.