es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El texto dentro de una vista de lista desaparece después de ingresar información.

Tengo un listView en el que pongo una vista lista varias veces. Esta vista tiene un cuadro de texto dentro de ella. El problema es que, cuando ingreso valores en el editText, desaparecen. Supongo que es un problema de enfoque, pero no puedo resolverlo.

Este es el método GetView de mi adaptador de ListView:

public override View GetView(int position, View convertView, ViewGroup parent)
{
    LayoutInflater layoutInflater = ((RegisterActivity3)context).LayoutInflater;
    View view = layoutInflater.Inflate(Resource.Layout.seekbarvalue_template, parent, false);

    TextView tvValueName = (TextView)view.FindViewById<textview>(Resource.Id.tvValueName);
    TextView tvAnotation = (TextView)view.FindViewById<textview>(Resource.Id.tvAnotation);
    TextView tvMetric = (TextView)view.FindViewById<textview>(Resource.Id.tvMetric);
    EditText etValue = (EditText)view.FindViewById<edittext>(Resource.Id.etValue);

    ValueSeekBar temp = objects[position];
    if (temp != null)
    {
        tvValueName.Text = temp.ValueName;
        tvMetric.Text = temp.Metric;
        tvAnotation.Text = temp.Anotation;
    }
    return view;

}

Video como referencia:
https://im2.ezgif.com/tmp/ezgif-2-86070710e4.gif

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con la reutilización de vistas en ListView, lo cual causa la pérdida de los valores de EditText. Una forma de solucionar esto es almacenar los valores ingresados en el dataset y actualizar el valor de EditText en consecuencia en el método GetView.

    Aquí hay una versión actualizada del método GetView:

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        if(convertView == null)
        {
            LayoutInflater layoutInflater = ((RegisterActivity3)context).LayoutInflater;
            convertView = layoutInflater.Inflate(Resource.Layout.seekbarvalue_template, parent, false);
        }
    
        TextView tvValueName = (TextView)convertView.FindViewById<textview>(Resource.Id.tvValueName);
        TextView tvAnotation = (TextView)convertView.FindViewById<textview>(Resource.Id.tvAnotation);
        TextView tvMetric = (TextView)convertView.FindViewById<textview>(Resource.Id.tvMetric);
        EditText etVlaue = (EditText)convertView.FindViewById<edittext>(Resource.Id.etValue);
    
        ValueSeekBar temp = objects[position];
        if (temp != null)
        {
            tvValueName.Text = temp.ValueName;
            tvMetric.Text = temp.Metric;
            tvAnotation.Text = temp.Anotation;
            etVlaue.Text = temp.EnteredValue; // establecer el valor guardado
            etVlaue.TextChanged += (sender, e) => {
                temp.EnteredValue = e.Text.ToString(); // actualizar el valor guardado
            };
        }
        return convertView;
    }
    

    El código anterior verifica si convertView es null, lo cual significa que se debe inflar una nueva vista. Luego, establece los valores de los TextViews y EditText a partir del dataset. Para EditText, establece el valor guardado y agrega un listener de evento TextChanged para actualizar el valor guardado cuando se cambia el texto.

    Ten en cuenta que la clase ValueSeekBar necesita tener una propiedad para almacenar el valor ingresado, por ejemplo:

    public class ValueSeekBar 
    {
        public string ValueName { get; set; }
        public string Anotation { get; set; }
        public string Metric { get; set; }
        public string EnteredValue { get; set; } // propiedad añadida
    }
    

    Espero que esto ayude!

Comments are closed.