Cambiar color y tachado de un texto del ListView. Programa similar a una lista de la compra.

3,419 views
Skip to first unread message

Alejandro Serrano

unread,
Oct 31, 2014, 12:36:41 PM10/31/14
to desarrollad...@googlegroups.com


Hola a todos, es la primera vez que escribo en este foro y tengo una duda que no consigo resolver. Lo que estoy intentado, es cambiar el color de la lista de la compra conforme voy adquiriendo los productos de tal forma que mi idea era cambiar la variable booleana de "false"(letras rojas y tachadas) a "true"(verdes) y esta siendo una odisea ya que a través de un if - else me notifica los cambios( con un Toast) cada vez que hago click por medio del método "onItemClick", pero no cambian los colores de las letras.

Os dejo el código que llevo escrito:
Muchas gracias de antemano ;P
----------------------------------------------------------------------------------------------------------------------------------------------------
 - MAINACTIVITY.JAVA

package com.example.actividad3;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.ListActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends ListActivity {

    Adaptador adaptador;
    List<Articulo> datos = new ArrayList<Articulo>();
   
    private static final int MENU_OP1 = 1;
    private static final int MENU_OP2 = 2;
   
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        ListView lv = (ListView) findViewById(android.R.id.list);
        final TextView tv1 = (TextView)findViewById(R.id.titulo);
       
        adaptador = new Adaptador(this);
        setListAdapter(adaptador);
       
        lv.setOnItemClickListener(new OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long arg3) {
                Articulo elegido =(Articulo) parent.getItemAtPosition(position);
                List<Articulo> datos = new ArrayList<Articulo>();
               
                CharSequence texto = "Seleccionado: " + elegido.getNombre();
                boolean state1 = true;
                boolean state2 = false;
               
               
               
                if(elegido.isComprado() == state1){
                    elegido.setComprado(state2);
                   
                    Toast.makeText(getBaseContext(), "Has desmarcado " + elegido.getNombre(), Toast.LENGTH_SHORT).show();
                    adaptador.notifyDataSetChanged();
                    Toast.makeText(getBaseContext(), "Actualización 1", Toast.LENGTH_SHORT).show();

                }else{
                    elegido.setComprado(state1);
                   
                    Toast.makeText(getBaseContext(), "Has marcado " + elegido.getNombre(), Toast.LENGTH_SHORT).show();
                    adaptador.notifyDataSetChanged();
                    Toast.makeText(getBaseContext(), "Actualización 1", Toast.LENGTH_SHORT).show();

                }
               
               
                adaptador.notifyDataSetChanged();
                Toast.makeText(getBaseContext(), "Actualización 2", Toast.LENGTH_SHORT).show();

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
       
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
----------------------------------------------------------------------------------------------------------------------------------------------------
- ADAPTADOR.JAVA

package com.example.actividad3;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class Adaptador extends ArrayAdapter<Articulo>{
     
    Activity context;
    public static List<Articulo> getArticulo(){
        List<Articulo> datos = new ArrayList<Articulo>();
        datos.add(new Articulo("Pan", false));
        datos.add(new Articulo("Leche", true));
        datos.add(new Articulo("Periódico", false));
        datos.add(new Articulo("Fruta",true));
        datos.add(new Articulo("Carne", true));
       
       
        return datos;
    }
   
       
       
    public Adaptador(Activity context){
        super(context,R.layout.fila,getArticulo());
        this.context = context;
    }
   
    public View getView(int position, View convertView, ViewGroup parent){
        View item = convertView; //Vista reutilizable
        final VistaTag vistaTag;
       
       
       
       
        if(item == null){
            LayoutInflater inflater = context.getLayoutInflater();
            item = inflater.inflate(R.layout.fila, null);
           
            vistaTag = new VistaTag();
           
           
            vistaTag.titulo = (TextView)item.findViewById(R.id.titulo);
           
           
            item.setTag(vistaTag);//Guardamos el objeto en el elemento.
           
           
           
        }else{
            //Reutilizamos la Vista y recuperamos el objeto interno
            vistaTag = (VistaTag)item.getTag();
            item = convertView;
        }
        vistaTag.titulo.setText((CharSequence)getArticulo().get(position).getNombre());
        if(getArticulo().get(position).isComprado()){
            vistaTag.titulo.setPaintFlags(vistaTag.titulo.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
            vistaTag.titulo.setTextColor(Color.parseColor("#00FF00")); //VERDE
            notifyDataSetChanged();
        }else{
            vistaTag.titulo.setPaintFlags(vistaTag.titulo.getPaintFlags() &~Paint.STRIKE_THRU_TEXT_FLAG);
            vistaTag.titulo.setTextColor(Color.parseColor("#FF0000")); //ROJO
            notifyDataSetChanged();
        }
       
       
       
        notifyDataSetChanged();
       
        return item;
       
    }
   
   
   
}
----------------------------------------------------------------------------------------------------------------------------------------------------
- ARTICULO.JAVA

package com.example.actividad3;

public class Articulo {

    private String nombre;
   
    private boolean comprado;
   
    public Articulo(String nombre, boolean comprado){
        this.nombre = nombre;
        this.comprado = comprado;
       
    }
   
    public String getNombre(){
        return nombre;
    }
   
    public boolean isComprado(){
        return comprado;
    }
   
    public void setNombre(String nombre){
        this.nombre = nombre;
    }
   
    public void setComprado(boolean comprado){
        this.comprado = comprado;
    }
    public Object getItem(int position){
        return position;
    }
   
}

- VISTATAG.JAVA

package com.example.actividad3;

import android.widget.ListView;
import android.widget.TextView;

public class VistaTag {
    public TextView titulo;

}
----------------------------------------------------------------------------------------------------------------------------------------------------
- ACTIVITY_MAIN.XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.actividad3.MainActivity"
    android:background="#000000" >

    <TextView
        android:id="@+id/MainTitulo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Lista de la compra"
        android:textSize="30dp"
        android:textColor="#FFFFFF" />

    <TextView
        android:id="@+id/MainDescripcion"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/MainTitulo"
        android:layout_below="@+id/MainTitulo"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="15dp"
        android:textColor="#FFFFFF"
        android:text="Pulsa un rato un artículo del listado para modificarlo o eliminarlo. También puedes usar el menú para añadir un nuevo artículo." />

    <ListView
        android:id="@+id/android:list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/MainDescripcion"
        android:layout_below="@+id/MainDescripcion"
        android:focusable="false"
        android:background="#000000" >
    </ListView>
   
   

</RelativeLayout>
----------------------------------------------------------------------------------------------------------------------------------------------------
- FILA.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
   
    <TextView
        android:id="@+id/titulo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="35dp"
        android:text="titulo"
        android:textSize="20dp" />

</LinearLayout>

----------------------------------------------------------------------------------------------------------------------------------------------------

Muchas gracias a todos por vuestro tiempo.

James Revelo

unread,
Nov 2, 2014, 8:47:37 PM11/2/14
to desarrollad...@googlegroups.com
Hola amigo, me parece que haz hecho todo super bien, la única falla pensaría yo, está en que tu adaptador no esta percibiendo cuando cambian los atributos de tu articulo, debido a que notifyDataSetChanged() se invoca automáticamente solo cuando utilizas métodos de modificación como add(), insert(), remove(), clear(), etc.

Si tu lo llamas manualmente no hace ningún efecto. Debes usar insert() para que el adaptador se de cuenta que un artículo cambio su estado a "comprado". Si haces eso, el adaptador llamará otra vez a getView() para renderizar de nuevo, pero esta vez con las nuevas características que tu le diste.

Espero te haya sido de utilidad, saludos!

Alejandro Serrano

unread,
Nov 5, 2014, 1:54:33 PM11/5/14
to desarrollad...@googlegroups.com
No sabía esa peculiaridad del notifyDataSetChanged() :S. He intentado hacerlo como tu dices de mil formas y no consigo que me actualice nada, me puedes poner un ejemplo? Muchas gracias. Un saludo.

James Revelo

unread,
Nov 5, 2014, 11:47:56 PM11/5/14
to
Sería algo como:

adaptador.insert(new Articulo(...), position);

Con eso reemplazarías el articulo en un posición y automáticamente se actualiza.

Te dejo este tutorial sobre listas y adaptadores, tal vez te sea de ayuda:


Saludos!

Alejandro Serrano

unread,
Nov 6, 2014, 4:37:58 PM11/6/14
to desarrollad...@googlegroups.com
Hola James,

He probado como tu dices, intentando declararlo de todas las formas que se me han ocurrido. He probado también creando un metodo insert en el adaptador y nada, ya que se me cerraba la aplicación, así que lo he borrado. Si lo dejo de la siguiente forma no me da ningun error y me deja correrla, pero en cuento hago click en un item true para que cambie a false, me cierra... :( ¿Qué estoy haciendo mal? Gracias por tu paciencia.

-MAINACTIVITY.JAVA


lv.setOnItemClickListener(new OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long arg3) {
                Articulo elegido =(Articulo) parent.getItemAtPosition(position);
                List<Articulo> datos = new ArrayList<Articulo>();
                Articulo art = new Articulo(null, false);

               
                CharSequence texto = "Seleccionado: " + elegido.getNombre();
                boolean state1 = true;
                boolean state2 = false;
                int index = (Integer) elegido.getItem(position);
               
               
                if(elegido.isComprado() == state1){
                    //elegido.setComprado(state2);
                    adaptador.insert(new Articulo(elegido.getNombre(), state2), index);

                    Toast.makeText(getBaseContext(), "Has desmarcado " + elegido.getNombre(), Toast.LENGTH_SHORT).show();
                    //tv1.setTextColor(Color.parseColor("#FF0000"));//Rojo
                   
                    adaptador.notifyDataSetChanged();
                   
                }else{
                    elegido.setComprado(state1);
                    //tv1.setTextColor(Color.parseColor("#00FF00"));//Verde

                    Toast.makeText(getBaseContext(), "Has marcado " + elegido.getNombre(), Toast.LENGTH_SHORT).show();
                   
                    adaptador.notifyDataSetChanged();
                }
               
                adaptador.notifyDataSetChanged();
               
            }
        });

       
       
    }



El jueves, 6 de noviembre de 2014 05:47:56 UTC+1, James Revelo escribió:
Sería algo como:

adaptador.insert(new Articulo(...), position);

Con eso reemplazarías el articulo en un posición y automáticamente se actualiza.

Te dejo este tutorial sobre listas y adaptadores, tal vez te sea de ayuda:


Saludos!

El miércoles, 5 de noviembre de 2014 13:54:33 UTC-5, Alejandro Serrano escribió:

James Revelo

unread,
Nov 6, 2014, 8:58:20 PM11/6/14
to desarrollad...@googlegroups.com
Hola Alejandro, si quieres, ve a la carpeta de tu proyecto y comprime en un .rar la carpeta main que se encuentra en src . Luego me lo envias para revisarlo

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/desarrolladores-android/Go_NILaARvY/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/7bc6dee1-0742-44c2-b3eb-d4fc97e19647%40googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
James Revelo Urrea
Ingeniero de Sistemas y Desarrollador de Videojuegos

James Revelo

unread,
Nov 9, 2014, 8:16:31 PM11/9/14
to desarrollad...@googlegroups.com
Hola Alejandro, acabo de resolver tu inconveniente. 

Primero que todo cambié el método getView() de tu adaptador, la verdad tenias algún código que no entendía y usabas una clase llamada VistaTag que no le vi ninguna utilidad. El método quedó así:

public View getView(int position, View convertView, ViewGroup parent){
View view = convertView; //Vista reutilizable

        /*
        Instancia del textview
         */
TextView nombre;
if(view == null){
LayoutInflater inflater = context.getLayoutInflater();
view = inflater.inflate(R.layout.fila, null);

}

        /*
        Obteniendo el titulo
         */
        nombre = (TextView)view.findViewById(R.id.titulo);

        /*
        Obteniendo una instancia del articulo procesado actualemente
         */
        Articulo article = getItem(position);

        /*
        Setear el texto
         */
nombre.setText( article.getNombre() );

if(article.isComprado()){
nombre.setPaintFlags(nombre.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
nombre.setTextColor(Color.parseColor("#00FF00")); //VERDE

}else{
nombre.setPaintFlags(nombre.getPaintFlags() &~Paint.STRIKE_THRU_TEXT_FLAG);
nombre.setTextColor(Color.parseColor("#FF0000")); //ROJO

}
return view;
}


Como ves, solo obtuve el articulo y luego asigne el nombre al textview titulo.

En cuanto al método onItemClick(), vi que tenías una condición que nunca iba a cambiar, creaste un if-else con dos estados, pero estos siempre iban a ser igual, asi que nunca pasaría nada. 

Para resolver el problema del refresco de la lista te había dicho que notifyDataSetChanged() se invocaba con los método de modificación del adaptador. Olvidaba que insert() sirve es para insertar un objeto en una posición dada, no es para actualizar. Por lo que cuando me funcionó, se añadían otros objetos en tiempo real, pero eso no era lo que queriamos.

Se me ocurrío remover el objeto y luego insertar otro y así simular la modificación. Pero recordé que a los adaptadores se les puede desactivar la llamada automatica de notifyDataSetChanged() con el método setNotifyOnChange(). Si invocas este método con el parámetro true, entonces desactivas la llamada automatica y entonces puedes llamar manualmente a notifyDataSetChanged() como lo venías haciendo. 

Sabiendo eso, ya puedes modificar tus objetos con setComprado() y luego llamar a notifyDataSetChanged(), con eso se actualiza en tiempo real tu Lista. Pero OJO, cuando lo llamas manualmente una vez, vuelve y se activa la llamada automática. Te aconsejo que solo lo desactives para la modificación, el borrado y la inserción hazlo con los métodos insert() y remove().

Te dejo el código del método de presión:

lv.setOnItemClickListener(new OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long arg3) {
Articulo elegido =(Articulo) parent.getItemAtPosition(position);

                /*
                Desactivar la llamada automatica de notifyDataSetChanged()
                 */
                adaptador.setNotifyOnChange(true);

if(elegido.isComprado()){

                    elegido.setComprado(false);

Toast.makeText(getBaseContext(),
                            "Has desmarcado " + elegido.getNombre(),
                            Toast.LENGTH_SHORT).show();
}else{

                    elegido.setComprado(true);
Toast.makeText(getBaseContext(),
                            "Has marcado " + elegido.getNombre(),
                            Toast.LENGTH_SHORT).show();

}

                adaptador.notifyDataSetChanged();
}
        });

Fue todo un gusto mi hermano, espero te sirva.

Saludos!


El viernes, 31 de octubre de 2014 11:36:41 UTC-5, Alejandro Serrano escribió:

Alejandro Serrano

unread,
Nov 11, 2014, 12:36:24 PM11/11/14
to desarrollad...@googlegroups.com
Lo voy a probar y mañana te digo James. Aunque ya te agradezco de antemano tu ayuda y tu rapidez. Muchísimas gracias!!! Mañana publico respuesta.

Alejandro Serrano

unread,
Nov 12, 2014, 11:26:36 AM11/12/14
to desarrollad...@googlegroups.com
Un codigo limpio y muy bien explicado. Me has resuelto el problema, ahora entiendo lo que pasaba... 

Agradezco muchísimo tu ayuda, me has explicado todo perfectamente. A partir de ahora te seguiré en tu blog "hermosaprogramacion".

Si necesitas algo, búscame en Google+. Un saludo y gracias! :P

El lunes, 10 de noviembre de 2014 02:16:31 UTC+1, James Revelo escribió:

James Revelo

unread,
Nov 12, 2014, 2:31:36 PM11/12/14
to desarrollad...@googlegroups.com
Con gusto Alejandro, me alegra que te haya servido. Espero que el blog también te sea de ayuda y lo recomiendes mucho con tus amigos.

Saludos!

James Revelo Urrea
Desarrollador de Software Independiente


--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/desarrolladores-android/Go_NILaARvY/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.
Message has been deleted
Message has been deleted

Juan de Dios Maldonado Sánchez

unread,
Jan 20, 2015, 5:10:40 AM1/20/15
to desarrollad...@googlegroups.com
Dudo mucho que alguien se descargue ese proyecto (o lo que sea) para importarlo en Eclipse/AndroidStudio, y ayudarte.
Cuanto más específica sea la duda, más posibilidad hay de que te ayuden.

No pretendas que nadie haga tu trabajo por ti.

2015-01-20 11:06 GMT+01:00 Moonligth <montse...@gmail.com>:
No consigo hacer esta actividad 
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Moonligth

unread,
Jan 20, 2015, 5:15:25 AM1/20/15
to desarrollad...@googlegroups.com
Hola el problema que tengo es que no me cambia de color los artículos que voy eligiendo y los cuadros de diálogo si pongo showDialog me pone que es deprecated. No se si me podreis ayudar de todas maneras ando a ver si googleando saco algo es q me he estancado :(
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a desarrolladores-android+unsubscr...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Juan de Dios Maldonado Sánchez

unread,
Jan 20, 2015, 5:18:47 AM1/20/15
to desarrollad...@googlegroups.com
Lo del deprecated no es un error, así que por eso no te preocupes. Es un aviso de que deberías mostrar los diálogos usando fragments (una nueva forma de hacerlo). Sobre lo otro... suerte.

Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Moonligth

unread,
Jan 20, 2015, 5:19:32 AM1/20/15
to
os pongo las clases que tengo

package es.mentor.example.unidad3.actividad3.listadocompra;

//Clase que se usa para definir las opciones del ListView
public class Articulo {
// Cada opción tiene un título y un subtítulo
private String nombre;
private boolean comprado;

public Articulo(String nombre, boolean comprado){
this.nombre = nombre;
this.comprado = comprado;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public boolean isComprado() {
return comprado;
}

public void setComprado(boolean comprado) {
this.comprado = comprado;
}
}


y esta a del listado 

package es.mentor.example.unidad3.actividad3.listadocompra;


import java.util.ArrayList;


import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;

import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;


public class ListadoCompra extends Activity {
private ListView listadoPrincipal;
// Definimos el adaptador que va a usar el ListView
private ArrayAdapter<String> adaptador;
// Matriz con los datos del adaptador
private String[] datos = new String[]{"Pan","Leche","Periódico","Fruta","Carne"};
    private static final int MenuNuevo=1;
    private AlertDialog.Builder ventana;
    private static final int DIALOGO_ENTRADA_TEXTO = 1;
    private static final int DIALOGO_NUEVO_TEXTO=2;
    
    
    
    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Obtenemos las referencias a los componentes
listadoPrincipal = (ListView)findViewById(R.id.ListadoPrincipal);

//Rellenamos la lista con datos de ejemplo
adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datos);
listadoPrincipal.setAdapter(adaptador);
//Asociamos los menús contextuales a los componentes
registerForContextMenu(listadoPrincipal);
listadoPrincipal.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
// Si se hace clic sobre una opción mostramos un mensaje
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Toast.makeText(getBaseContext(), "Has hecho clic en  "+adaptador.getItem(position).toString(), 1).show();
}
});
 
}//fin Bundle
    
 
    
    
// Definimos el Adaptador que dibuja la opciones del ListView
    public class Adaptador extends ArrayAdapter<Articulo> {

    Activity contexto;
    ArrayList <Articulo> datos;
    // Contructor del adaptador usando el contexto de la aplicación actual
    public Adaptador(Activity contexto,ArrayList <Articulo> datos) {
    // Llamamos al constructor de la clase superior
    //super(contexto, R.layout.opciones, datos);
    super(contexto, R.layout.articulos, datos);
    this.contexto = contexto;
    this.datos=datos;
   
    }
   
    public View getView(int position, View convertView, ViewGroup parent)
    {
    Articulo opcion= datos.get(position); //los datos que se cargan
    // Vista que Android indica como reutilizable
    View item = convertView;
    // Esta variable se usa para almacenar un objeto dentro
    // de la Vista que dibuja la opción
    VistaTag vistaTag;

    // Si Android indica que no hay una Vista reutilizable para la opción,
    // la definimos, inflamos el diseño que se define en el fichero
    //  listitem_opcion.xml y establecemos su contenido
    if(item == null) //si es la primera vez que se entra en la pantalla
    {
    // Usamos un Inflater para inflar el diseño
    // Ahora tenemos una Vista que se asocia al elemento
    LayoutInflater inflater = contexto.getLayoutInflater();
    // Definimos en la vista de vuelta el tipo de diseño
    item = inflater.inflate(R.layout.articulos, null);

    // Definimos el objeto que vamos a almacenar en el nuevo elemento
    vistaTag = new VistaTag();
    // Obtenemos los punteros a las etiquetas recién infladas
   
    vistaTag.nombreArticulo = (TextView)item.findViewById(R.id.articuloXml);
   
    if (datos.get(position).isComprado()) { vistaTag.nombreArticulo.setPaintFlags(vistaTag.nombreArticulo.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        vistaTag.nombreArticulo.setTextColor(Color.parseColor("#00FF00"));
        } else {
        vistaTag.nombreArticulo.setPaintFlags(vistaTag.nombreArticulo.getPaintFlags() &~Paint.STRIKE_THRU_TEXT_FLAG);
            vistaTag.nombreArticulo.setTextColor(Color.parseColor("#FF0000"));
        }
    // Guardamos el objeto en el elemento
    item.setTag(vistaTag);
    }
    else
    {
    // Si estamos reutilizando una Vista, recuperamos el objeto interno
    vistaTag = (VistaTag)item.getTag();
    }
   
    vistaTag.nombreArticulo.setText(opcion.getNombre());
   
   
   
    return item;
   
   
   
    }
    }

    class VistaTag {
    TextView nombreArticulo;
   
    }
    
    
    
    //creo la ventana de diálogo para editar el texto 
    protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOGO_ENTRADA_TEXTO:
    // Primero preparamos el interior de la ventana de diálogo inflando su fichero XML
String infService = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater li =(LayoutInflater)getApplicationContext().getSystemService(infService);
// Inflamos el componente compuesto definido en el XML
View inflador = li.inflate(R.layout.editararticulo, null);
// Buscamos los componentes dentro del Diálogo
final TextView nombreEdit = (TextView) inflador.findViewById(R.id.editararticulo);    

ventana = new AlertDialog.Builder(this);
ventana.setTitle("Editar Artículo");
// Asignamos el contenido dentro del diálogo (el que hemos inflado previamente)
ventana.setView(inflador);
// ¡¡ No se puede incluir un mensaje dentro de este tipo de diálogo!!!
ventana.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int boton) {
Toast.makeText(getApplicationContext(), "Has cambiado el artículo '"+
nombreEdit.getText().toString() +"' y has pulsado el botón 'Aceptar'", 1).show();
}
});
ventana.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int boton) {
Toast.makeText(getApplicationContext(), "Has pulsado el botón 'Cancelar'", 1).show();
}
});
return ventana.create();
    case DIALOGO_NUEVO_TEXTO:
    // Primero preparamos el interior de la ventana de diálogo inflando su fichero XML
    String infService2 = Context.LAYOUT_INFLATER_SERVICE;
    LayoutInflater li2 =(LayoutInflater)getApplicationContext().getSystemService(infService2);
    // Inflamos el componente compuesto definido en el XML
    View inflador2 = li2.inflate(R.layout.nuevoarticulo, null);
    // Buscamos los componentes dentro del Diálogo
    final TextView nombreEdit2 = (TextView) inflador2.findViewById(R.id.nuevoarticulo);    

    ventana = new AlertDialog.Builder(this);
    ventana.setTitle("Nuevo Artículo");
    // Asignamos el contenido dentro del diálogo (el que hemos inflado previamente)
    ventana.setView(inflador2);
    // ¡¡ No se puede incluir un mensaje dentro de este tipo de diálogo!!!
    ventana.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int boton) {
    Toast.makeText(getApplicationContext(), "Has introducido nuevo artículo '"+
    nombreEdit2.getText().toString() +"' y has pulsado el botón 'Aceptar'", 1).show();
    }
    });
    ventana.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int boton) {
    Toast.makeText(getApplicationContext(), "Has pulsado el botón 'Cancelar'", 1).show();
    }
    });
    return ventana.create();
    } // fin switch
    return null;
   
   
   
    }// fin onCreateDialog
    
    
    
    





@Override
// Método donde definimos el menú contextual cuando se despliega
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
//Inflador del menú contextual
MenuInflater inflater = getMenuInflater();
// Si el componente que vamos a dibujar es la etiqueta usamos
// el fichero XML correspondiente
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo)menuInfo;
// Definimos la cabecera del menú contextual
menu.setHeaderTitle(
listadoPrincipal.getAdapter().getItem(info.position).toString());
// Inflamos el menú contextual
inflater.inflate(R.menu.menulista, menu);
}//fin onCreateContextMenu
@Override
// Si el usuario selecciona una opción del menú contextual mostramos
// la opción seleccionada en la etiqueta
public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info =
(AdapterContextMenuInfo) item.getMenuInfo();

switch (item.getItemId()) {
// Se selecciona la opción 1 de menú contextual de la etiqueta
// Se selecciona la opción "Editar texto opción" de menú contextual de la etiqueta
case R.id.EditTextOp:
Toast.makeText(getApplicationContext(), "Has pulsado el botón 'Editar del menú contextual'", 1).show();
// Cambiamos el contenido de la matriz de datos
//datos[info.position]="Opción "+info.position+" listado  modificado";
// Reiniciamos el adaptador para que recargue los datos y actualice el ListBox
adaptador.notifyDataSetChanged();
return true;
// Se selecciona la opción "Borra texto opción" de menú contextual de la etiqueta
case R.id.BorrarTextOp:
Toast.makeText(getApplicationContext(), "Has pulsado el botón 'Borrar del menú contextual'", 1).show();
//datos[info.position]="Opción "+info.position+" listado";
adaptador.notifyDataSetChanged();
return true;
default:
return super.onContextItemSelected(item);
}
} //fin onContextItemSelected
//botón menú nuevo artículo
public boolean onCreateOptionsMenu(Menu menu) {
 menu.add(Menu.NONE, MenuNuevo, Menu.NONE, "Nuevo artículo").setIcon(R.drawable.add);
 
return true;
} // end onCreateOptionsMenu
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MenuNuevo:
// DialogFragment(DIALOGO_NUEVO_TEXTO);
/*((ListView) findViewById(R.id.nuevoarticulo)).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
DialogFragment(DIALOGO_NUEVO_TEXTO);
}
});*/

Toast.makeText(getApplicationContext(), "Has pulsado el botón Nuevo", 1).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
} //end onOptionsItemSelected
} // end class ListadoCompra

Moonligth

unread,
Jan 22, 2015, 4:48:53 AM1/22/15
to desarrollad...@googlegroups.com
Ya encontré uno de los problemas yo ponía el adaptador de mis artículos como ArrayAdapter no como el Adaptador que había hecho por lo que no llegaba a coger los colores ni nada. Hice una clase solo para el adaptador así se ve mucho más desahogada la clase principal. Dejo el código por si le sirve a alguien. Lo que me queda lo iré mirando y ya lo subiré que seguro que a alguien le sirve

//clase principal
package es.mentor.example.unidad3.actividad3.listadocompra;


import java.util.ArrayList;


import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;

import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;


public class ListadoCompra extends Activity {
private ListView listadoPrincipal;
private AdaptadorArticulos adaptador;
ArrayList<Articulo> datos= new ArrayList<Articulo>();
    private static final int MenuNuevo=1;
    private AlertDialog.Builder ventana;
    private static final int DIALOGO_ENTRADA_TEXTO = 1;
    private static final int DIALOGO_NUEVO_TEXTO=2;
    
    
    
    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Obtenemos las referencias a los componentes
listadoPrincipal = (ListView)findViewById(R.id.ListadoPrincipal);

//Rellenamos la lista con datos de ejemplo
   
    datos.add(new Articulo("Pan", false));
    datos.add(new Articulo("Leche", true));
    datos.add(new Articulo("Periódico", false));
    datos.add(new Articulo("Fruta", true));
    datos.add(new Articulo("Carne", false));

adaptador = new AdaptadorArticulos(this, datos);
listadoPrincipal.setAdapter(adaptador);
//Asociamos los menús contextuales a los componentes
registerForContextMenu(listadoPrincipal);
listadoPrincipal.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
// Si se hace clic sobre una opción mostramos un mensaje
public void onItemClick(AdapterView<?> AdaptadorArticulos, View view, int position, long id) {
// Marcamos la opción correspondiente
adaptador.getItem(position).setComprado(!adaptador.getItem(position).isComprado());
//Toast.makeText(getBaseContext(), "Has hecho clic en  "+adaptador.getItem(position).toString(), 1).show();
}
});
 
}//fin Bundle
    
 
    
    
    
    
    
DialogFragment(DIALOGO_ENTRADA_TEXTO);
}
});*/

Toast.makeText(getApplicationContext(), "Has pulsado el botón Nuevo", 1).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
} //end onOptionsItemSelected
} // end class ListadoCompra


//clase adaptador

package es.mentor.example.unidad3.actividad3.listadocompra;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;


//Definimos el AdaptadorArticulos que dibuja la opciones del ListView
public class AdaptadorArticulos extends ArrayAdapter<Articulo> {

Activity contexto;
//ArrayList <Articulo> datos;
ArrayList <Articulo> datos ;//= new ArrayList <Articulo>();
// Contructor del AdaptadorArticulos usando el contexto de la aplicación actual
public AdaptadorArticulos(Activity contexto,ArrayList <Articulo> datos) {
// Llamamos al constructor de la clase superior
//super(contexto, R.layout.opciones, datos);
super(contexto, R.layout.articulos, datos);
this.contexto = contexto;
this.datos=datos;
}
public View getView(int position, View convertView, ViewGroup parent)
{
Articulo opcion= datos.get(position); //los datos que se cargan
// Vista que Android indica como reutilizable
View item = convertView;
// Esta variable se usa para almacenar un objeto dentro
// de la Vista que dibuja la opción
VistaTag vistaTag;

// Si Android indica que no hay una Vista reutilizable para la opción,
// la definimos, inflamos el diseño que se define en el fichero
//  listitem_opcion.xml y establecemos su contenido
if(item == null) //si es la primera vez que se entra en la pantalla
{
// Usamos un Inflater para inflar el diseño
// Ahora tenemos una Vista que se asocia al elemento
LayoutInflater inflater = contexto.getLayoutInflater();
// Definimos en la vista de vuelta el tipo de diseño
item = inflater.inflate(R.layout.articulos, null);

// Definimos el objeto que vamos a almacenar en el nuevo elemento
vistaTag = new VistaTag();
// Obtenemos los punteros a las etiquetas recién infladas
vistaTag.nombreArticulo = (TextView)item.findViewById(R.id.articuloXml);
// Guardamos el objeto en el elemento
item.setTag(vistaTag);
}
else
{
// Si estamos reutilizando una Vista, recuperamos el objeto interno
vistaTag = (VistaTag)item.getTag();
}
vistaTag.nombreArticulo.setText(opcion.getNombre());
if (datos.get(position).isComprado()) { vistaTag.nombreArticulo.setPaintFlags(vistaTag.nombreArticulo.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
vistaTag.nombreArticulo.setTextColor(Color.parseColor("#00FF00"));
} else {
vistaTag.nombreArticulo.setPaintFlags(vistaTag.nombreArticulo.getPaintFlags() &~Paint.STRIKE_THRU_TEXT_FLAG);
    vistaTag.nombreArticulo.setTextColor(Color.parseColor("#FF0000"));
}
return item;
}
}

class VistaTag {
public TextView nombreArticulo;
}



El viernes, 31 de octubre de 2014, 17:36:41 (UTC+1), Alejandro Serrano escribió:
Reply all
Reply to author
Forward
0 new messages