entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

ListView muestra repetido el último objeto de ArrayList

Hola a todos. A ver si me pueden ayudar.
Tengo el siguiente problema: Tengo un ArrayList de objetos. Y quiero mostrar estos objetos del ArrayList en un ListView con un Adapter personalizado. La cosa esta en que solo me muestra el último objeto del ArrayList tantas veces como objetos haya en el array. Osea, si hay tres objetos, me muestra el último tres veces..........
Les dejo el código el adapter y del que contiene el ListView a ver que opinan:

public class IncidenciaAdapter extends ArrayAdapter {

// Hacemos que nuestra clase herede las características de un ArrayAdapter

Activity context;
ArrayList<Incidencia> datos = new ArrayList<>();
/* Creamos las variables necesarias para capturar el contexto
*  y los datos que se publicarán en la lista
*/

public IncidenciaAdapter(Activity context,ArrayList<Incidencia> datos) {
    super(context,R.layout.listview,datos);
    this.context=context;
    this.datos=datos;
    // TODO Auto-generated constructor stub
}

/* Constructor de la clase, donde pasamos por parámetro los datos
 * a mostrar en la lista y el contexto
*/
public View getView(int position, View convertView, ViewGroup parent)
{

    LayoutInflater inflater=context.getLayoutInflater();
    View item=inflater.inflate(R.layout.listview, null);

    TextView codigo=(TextView) item.findViewById(R.id.textView10);
    codigo.setText(datos.get(position).getCodigo());

    TextView estado=(TextView) item.findViewById(R.id.textView11);
    estado.setText(datos.get(position).getEstado());

    TextView fecha=(TextView) item.findViewById(R.id.textView12);
    fecha.setText(datos.get(position).getFecha());

    TextView dispositivo=(TextView) item.findViewById(R.id.textView13);
    dispositivo.setText(datos.get(position).getDispositivo());

    TextView categoria=(TextView) item.findViewById(R.id.textView14);
    categoria.setText(datos.get(position).getCategoria());

    TextView severidad=(TextView) item.findViewById(R.id.textView15);
    severidad.setText(datos.get(position).getSeveridad());

    TextView prioridad=(TextView) item.findViewById(R.id.textView16);
    prioridad.setText(datos.get(position).getPrioridad());

    TextView resumen=(TextView) item.findViewById(R.id.textView17);
    resumen.setText(datos.get(position).getResumen());

    TextView descripcion=(TextView) item.findViewById(R.id.textView18);
    descripcion.setText(datos.get(position).getDescripcion());

    return item;
}

}

Y este es el otro:

public class Encontrar extends Activity {

Incidencia aux = new Incidencia();

ArrayList<Incidencia> datos = new ArrayList<>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.encontrar);

    aux.setCodigo("0");
    aux.setEstado("nuevo");
    aux.setFecha("junio");
    aux.setDispositivo("raton");
    aux.setCategoria("periferico");
    aux.setSeveridad("mucha");
    aux.setPrioridad("alta");
    aux.setResumen("resumido");
    aux.setDescripcion("descripcion");

    datos.add(aux);

    aux.setCodigo("1");
    aux.setEstado("en curso");
    aux.setFecha("marzo");
    aux.setDispositivo("monitor");
    aux.setCategoria("periferico");
    aux.setSeveridad("poca");
    aux.setPrioridad("alta");
    aux.setResumen("resumiendo");
    aux.setDescripcion("decripción");

    datos.add(aux);

    aux.setCodigo("2");
    aux.setEstado("en curso");
    aux.setFecha("mayo");
    aux.setDispositivo("torre");
    aux.setCategoria("hardware");
    aux.setSeveridad("poca");
    aux.setPrioridad("alta");
    aux.setResumen("resumiendo");
    aux.setDescripcion("decripción");

    datos.add(aux);

    int num = datos.size();
    Toast.makeText(getApplicationContext(), "num="+num, Toast.LENGTH_SHORT).show();

    IncidenciaAdapter miAdaptador=new IncidenciaAdapter(this,datos);

    ListView lstvista = (ListView) findViewById(R.id.listView);
    lstvista.setAdapter(miAdaptador);

}

}

He creado tres objetos de prueba, y muestra el ultimo tres veces en el ListView, y no consigo ver cual es el problema.

EDITADO: Me acabo de dar cuenta que el error esta en la clase Encontrar, pues cada vez que añado un objeto al ArrayList parece que borra lo que hay y añade el ultimo tantas veces como objetos haya. Me explico:
Inserto el primero y compruebo que hay en el codigo del primer objeto, y efectivamente hay un 0.
Inserto el segundo y compruebo que hay en el código del primer objeto, y resulta que hay un 1.
Si inserto el tercero y vuelvo a mirar el mismo hay un 2, y resulta que hay un dos en los tres objetos.

0voto

nachito777sk comentado

Bueno, ya lo he arreglado de la siguiente manera:

aux = new Incidencia();

    aux.setCodigo("0");
    aux.setEstado("nuevo");
    aux.setFecha("junio");
    aux.setDispositivo("raton");
    aux.setCategoria("periferico");
    aux.setSeveridad("mucha");
    aux.setPrioridad("alta");
    aux.setResumen("resumido");
    aux.setDescripcion("descripcion");

    datos.add(aux);
    aux = new Incidencia();

    aux.setCodigo("1");
    aux.setEstado("en curso");
    aux.setFecha("marzo");
    aux.setDispositivo("monitor");
    aux.setCategoria("periferico");
    aux.setSeveridad("poca");
    aux.setPrioridad("alta");
    aux.setResumen("resumiendo");
    aux.setDescripcion("decripción");

    datos.add(aux);
    aux = new Incidencia();

    aux.setCodigo("2");
    aux.setEstado("en curso");
    aux.setFecha("marzo");
    aux.setDispositivo("monitor");
    aux.setCategoria("periferico");
    aux.setSeveridad("poca");
    aux.setPrioridad("alta");
    aux.setResumen("resumiendo");
    aux.setDescripcion("decripción");

Creando una nueva Incidencia(), no me ha quedado muy claro el por que he de hacer esto. Ha ver si alguien sabe explicarlo, le estaría muy agradecido.
Gracias.

0voto

white comentado

Sucede que estas definiendo y re definiendo a los miembros de la clase Incidencia una y otra vez, al crear una nueva instancia estas guardando varias en el ArrayList con diferentes valores, el error que tenías era que guardabas la misma instancia de la clase Incidencia, te salía repetido el último valor por que definías los miembros de esta instancia al final.

0voto

carlossevi comentado

Deberías poner tu comentario como respuesta y dar por solucionado el tema. Respecto a la explicación, sin dominar Java me atrevería a decir que es un problema de punteros y objetos.

Con la siguiente expresión: datos.add(aux); internamente no se hace una copia de los datos de aux, sino que se referencia, indicando que en esa posición tiene que estar aux.

Como las siguientes veces actualizas aux, lo que haces es:

  1. Dar valores 0 a aux
  2. Establecer que en la primera posición tiene que aparecer aux
  3. Dar valores 1 a aux
  4. Establecer que en la segunda posición tiene que aparecer aux
  5. Dar valores 2 a aux
  6. Establecer que en la tercera posición tiene que aparecer aux

Al final tienes 3 posiciones, en las 3 aparece aux que tiene los valores 2 (los últimos establecidos).

0voto

Peter comentado

Por favor publica la solución en una respuesta nueva y seleccionala como correcta.

Saludos.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta