enter image description here

Estoy intentando crear una vista de lista personalizada. La lista se declara de la siguiente manera

List<DocRow> doctors = new ArrayList<>();

A continuación, se completa esta lista.

Mi adaptador de matriz personalizado está en una clase separada con su constructor declarado como se muestra a continuación.

public class DocAdapter extends ArrayAdapter<DocRow>{
    Context context;
    int resource;
    ArrayList<DocRow> doctors;
    private LayoutInflater inflater;

    public DocAdapter(@NonNull Context context, @LayoutRes int resource, ArrayList<DocRow> doctors) {
        super(context, resource, doctors);
        this.context = context;
        this.resource = resource;
        this.doctors = doctors;
        inflater = LayoutInflater.from(context);
    }

Ahora, en mi actividad principal, estoy tratando de crear un nuevo adaptador de matriz personalizado pasando mi lista (que es un parámetro válido), no se acepta. El código para la creación y configuración del adaptador para vincular la vista de lista con la lista se encuentra a continuación.

DocAdapter adapter = new DocAdapter(getApplicationContext(), R.layout.doc_row, doctors);
docList.setAdapter(adapter);

¿Alguien puede explicar cuál es el problema? El enlace para la captura de pantalla del error está arriba. Intenté buscar este problema específico, pero no he podido encontrar una solución que funcione.

1
Sid Chopra 14 nov. 2017 a las 14:29

2 respuestas

La mejor respuesta

Cambie su argumento de constructor a List en lugar de ArrayList mientras pasa la lista en él.

 List<DocRow> doctors;

 public DocAdapter(@NonNull Context context, @LayoutRes int resource, List<DocRow> doctors) {
        super(context, resource, doctors);
        this.context = context;
        this.resource = resource;
        this.doctors = doctors;
        inflater = LayoutInflater.from(context);
    }

Como lo señaló @Tim, aquí hay un pequeño detalle sobre por qué es necesario.

Cuando se inicializa una instancia, se puede inicializar con una de sus clases secundarias, pero el objeto sigue siendo una instancia de Superclase únicamente (debido al polimorfismo en tiempo de ejecución) y, por lo tanto, los métodos que consumen esta instancia esperan una superclase o la instancia debe ser convertida a la superclase antes de pasarlo.

La forma más fácil de identificar es mirar siempre el tipo en el lado izquierdo.

List a=new ArrayList();

En el ejemplo anterior, la instancia es en realidad una lista de matrices pero es de Lista de tipos.

2
Nayan Srivastava 14 nov. 2017 a las 11:45

La referencia de una clase principal puede almacenar el objeto de una subclase, pero lo contrario no es cierto.

Aquí, en el constructor de su adaptador, tiene ArrayList<DocRow> como su tipo de parámetro, pero su lista doctors es de tipo List<DocRow>. Usted, está pasando un objeto List<> a una referencia ArrayList<>.

Para resolverlo, cambie el tipo de variable de su doctor a ArrayList<> o el tipo de parámetro de su constructor a List<>

0
Bhavit S. Sengar 14 nov. 2017 a las 11:48