2012-03-31 18 views
10

La clase interna es un adaptador, la clase interna-interna es el Oyente. ¿Cómo acceder (obscurecido) a los miembros/métodos del adaptador de Listener?Dos clases internas anónimas dobles anidadas. ¿Cómo conseguir miembros de la clase anónimos de primer nivel?

list.setAdapter(new Adapter() { 
    public View getView() { 
    // ... 
    button.setListener(new Listener() { 
     public void onClick() { 
     Adapter.this.remove(item); 
     } 
    ); 
    } 
}); 

Normalmente acceder a los miembros de clases externas, que acaba de decir Outer.this.member, pero en este caso me dio el siguiente error (utilizando la clase real):

error: not an enclosing class: ArrayAdapter 

Entonces, ¿cómo se supone que debes acceder a los miembros de la clase interna de una clase interna-interna? No me gustan las clases anónimas anidadas de varios niveles, pero en este caso estoy aprendiendo una API nueva y todavía no estoy seguro de una forma más limpia. Ya tengo una solución, pero quería saber de todos modos. remove() no está realmente oscurecido por la clase inner-inner, por lo que la especificación de la clase no es realmente necesaria en este caso, pero quería dejar en claro en el código exactamente dónde está este método remove(). También quería saber en caso de que esté oscurecido. Creo que usar Outer.$6.remove() funcionaría, pero tampoco creo que deba ser así.

Respuesta

12

Asignar this a una variable, entonces el acceso que uno de clase más interna.

list.setAdapter(new Adapter() { 
    public View getView() { 
    final Adapter that = this; 
    button.setListener(new Listener() { 
     public void onClick() { 
     that.remove(item); 
     } 
    ); 
    } 
}); 

No estoy seguro de lo que sería una buena denominación aquí. Tal vez adapter?

+0

Ya veo. Pensé que habría una sintaxis de lenguaje para utilizar con el fin de obtener en Adapter que yo no sabía. Por cierto 'que' tendría que ser final. – Chloe

+1

Prefiero este enfoque, ya que es fácil de leer y explícito. – skrat

+0

Aparece un error de compilación en la línea Adaptador que = Adaptador. Esto; (El adaptador no es una clase adjunta). En cambio, deberías estar diciendo Adaptador final que = esto ... si es que ... – sethu

0

su simple como esto: tratar outer.remove sin esta clase puntero

+0

Eso no funcionará. remove() no es un método de Outer. Es un método de Adaptador. – Chloe

1

Sólo tiene que llamar al método de adaptador directamente:

list.setAdapter(new Adapter() { 
    public View getView() { 
    // ... 
    button.setListener(new Listener() { 
     public void onClick() { 
     remove(item); // <-- this will call Adapter's method of the anonymous class 
     } 
    ); 
    } 
}); 
+2

Lo sé. Pero, ¿qué sucede si el oyente tiene un método remove()? ¿Y que? – Chloe

+1

¡Buena pregunta! Lo investigaré esta noche. – Bohemian

Cuestiones relacionadas