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:
-
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.
-
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.
-
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; }
- No se pueden obtener widgets de main.xml referenciados en el programa Java
- Android Java: Desactivar la pantalla
- ¿Cómo clonar Joda DateTime?
- Android Java: Utilizar setOnClickListener en el bucle for
- Android uiautomator runtest error no encontró clase
- Custom ViewPager para permitir que el control GoogleMap infantil se desplace horizontalmente
- ¿Cuáles son las consecuencias de tener el ID de SENDER de GCM expuesto?
- ListView: evita que una vista se recicle
Soluciones para el número 3:
-
Establezca
descendantFocusablity="beforeDescendants"
en el listview. -
Establecer
windowSoftInputMode="adjustPan"
en el manifiesto -
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);
- Java.lang.IllegalStateException: ArrayAdapter requiere que el identificador de recurso sea un TextView
- Cambiar la tipografía del snackbar