Foro de elhacker.net

Programación => Java => Mensaje iniciado por: TickTack en 28 Febrero 2019, 12:33 pm



Título: Android - Componente ListView (grabar sus datos con la clase SharedPreferences)
Publicado por: TickTack en 28 Febrero 2019, 12:33 pm
Hola a todos,

antes de hacer mis preguntas quisiera mostrarles un código:

Código:
lv1.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
final int posicion=i;
AlertDialog.Builder dialogo1 = new AlertDialog.Builder(MainActivity.this); dialogo1.setTitle("Importante");
dialogo1.setMessage("¿ Elimina este teléfono ?"); dialogo1.setCancelable(false); dialogo1.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogo1, int id) {
String s=datos.get(posicion);
StringTokenizer tok1=new StringTokenizer(s,":");
String nom=tok1.nextToken().trim();
SharedPreferences.Editor elemento=prefe1.edit(); elemento.remove(nom);
elemento.commit();
datos.remove(posicion);
adaptador1.notifyDataSetChanged(); } });});

Teniendo en cuenta que "datos" es un objeto de la clase ArrayList<String>:

1) Tengo entendido que en los métodos setOnItemLongClickListener y setPositiveButton se envía cómo parámetro un método anónimo de las clases respectivas (AdapterView.OnItemLongClickListener y DialogInterface.OnClickListener). ¿Estoy en lo correcto?

2) Si los métodos anónimos no le pertenecen a la clase a la cual le pertenece el atributo "datos", ¿cómo es posible que estos métodos tengan acceso a los atributos de una clase ajena?

3) Suponiendo que de alguna forma los métodos anónimos si tienen acceso a la clase a la cual le pertenece el atributo "datos", ¿cómo es posible que el método anónimo de la clase DialogInterface.OnClickListener tenga acceso a la variable local "posicion" del método anónimo de la clase AdapterView.OnItemLongClickListener?

Gracias y saludos


Título: Re: Android - Componente ListView (grabar sus datos con la clase SharedPreferences)
Publicado por: srWhiteSkull en 7 Marzo 2019, 00:46 am
Antes que nada decirte que la presentación del código es nefasta, ilegible, no puedes amontonarlo así como si fuera basura. Me ha costado sudores saber que coño código era eso.

1) Tengo entendido que en los métodos setOnItemLongClickListener y setPositiveButton se envía cómo parámetro un método anónimo de las clases respectivas (AdapterView.OnItemLongClickListener y DialogInterface.OnClickListener). ¿Estoy en lo correcto?
No, el uso de estructuras clases, interfaces, funciones, etc.. anónimas se usa cuando se quiere implementar código que únicamente se usará ahí, por lo contrario, si haces uso del mismo código en otras partes del programa lo suyo es crear una función, clase o lo que sea e instaciar o lo que sea. Además no queda legible.

2) Si los métodos anónimos no le pertenecen a la clase a la cual le pertenece el atributo "datos", ¿cómo es posible que estos métodos tengan acceso a los atributos de una clase ajena?

3) Suponiendo que de alguna forma los métodos anónimos si tienen acceso a la clase a la cual le pertenece el atributo "datos", ¿cómo es posible que el método anónimo de la clase DialogInterface.OnClickListener tenga acceso a la variable local "posicion" del método anónimo de la clase AdapterView.OnItemLongClickListener?
Pues te contesto a las dos con una sola respuesta; por medio de los argumentos. Al dispararse el evento en el objeto lv1, este llama a la función que tienes sobreescrita, onItemLongClick() y le pasa por parámetro los datos intrínsecos del objeto. Aparte para que posición sea visible en todo el ámbito, incluso de otros ámbitos dentro de éste, el código usa la instrucción final.

PD Si el código estuviera bien tabulado con saltos de línea al final de cada punto y coma se vería más claro.