0 votos

Antes que nada Buenas Noches a todos. Estoy aprendiendo a programar Android(soy bastante novato), y estoy teniendo complicaciones para interactuar con los listview.

Estoy creando una aplicación modelo muy sencilla de listview para poder poder usarla en futuros programas en las que lo necesite. Es una aplicación que me muestra un array de elementos con un botón para agregar nuevos. El list tiene una imagen, un texto y un botón que sirve para eliminar el mismo item de la linea del botón.

El list lo genero sin problemas, puedo agregar un item a la lista sin problemas, el problema es cuando quiero eliminar un item del list. Este procedimiento lo hago dentro del adaptador, con un onclicklistener, el item se borra pero no encuentro la manera de refrescar el list para que me arroje la view correspondiente.

El xml principal es>>>

<LinearLayout 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"  tools:context=".MainActivity"
    android:orientation="vertical">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="PONELE CONDIMENTO"/>

    <Button
        android:id="@+id/nb"
        android:text="NUEVO"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="300dp">

        <ListView
            android:id="@android:id/list"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:drawSelectorOnTop="false">

            </ListView>
        <TextView

            android:text="LISTA VACIA :/"
            android:id="@android:id/empty"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="25dp"/>
        </FrameLayout>

 

</LinearLayout>



El del listpersonalizado>>>

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <ImageView
        android:layout_width="?android:attr/listPreferredItemHeight"
        android:layout_height="wrap_content"
        android:id="@+id/icono"
        android:src="@drawable/papiroabierto"/>
    <TextView
        android:id="@+id/titulo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/botonb"
        android:text="BORRAR"
        android:focusable="false"
        />
</LinearLayout>

 

preguntado por Takin Feb 8, 2015 en Android

2 Respuestas

0 votos

La Actividad principal>>>

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

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.Vector;

public class MainActivity extends ListActivity {
    public Vector<String> vec = new Vector<String>();

    public Button nuevo;
    public String nomelemento;
    public static String TAG = "TAG Activity :";
    public MiAdaptador mAdaptador = new MiAdaptador(this,vec);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nuevo = (Button) findViewById(R.id.nb);

        vec.add("Elemento1");
        vec.add("Elemento2");

        refreshlista();

        nuevo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                guardarDialog();
            }
        });

 

           }

        /////// METODO PARA GUARDAR ELEMENTO DESDE EL DIALOG/////////////
    private void guardarDialog(){
        AlertDialog.Builder dialogo = new AlertDialog.Builder(this);
        final EditText nombreElemento = new EditText(this);
        dialogo.setTitle("Nuevo Elemento");
        dialogo.setView(nombreElemento);
        dialogo.setPositiveButton("CREAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                nomelemento = (String) nombreElemento.getText().toString();
                vec.add(nomelemento);
                Log.i(TAG,"AHORA VA EL LISTADAPTER ");
                refreshlista();
        }
        });
        dialogo.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "Acción cancelada", Toast.LENGTH_SHORT).show();
            }
        });

        dialogo.create();
        dialogo.show();

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG,"ESTAMOS EN RESUME");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG,"ESTAMOS EN PAUSA");
    }

    ///////////////// DETECTAR ITEM PULSADOS////////////////////
    @Override protected void onListItemClick(ListView listView,
                                             View view, int position, long id) {
        super.onListItemClick(listView, view, position, id);
        Object o = getListAdapter().getItem(position);
     Log.i(TAG,"EL ID ES : "+Long.toString(id));
        Log.i(TAG,"EL OBJETO ES : "+o.toString());
        Log.i(TAG,"LA POSICION ES : "+Integer.toString(position));

    }

    ///////////////REFRESH DE LISTVIEW////////////////

    public void refreshlista(){
        setListAdapter(mAdaptador);
    }

}




El adaptador >>>

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

import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.jgiuliano.listviewpersonalizado.R;

import java.util.Objects;
import java.util.Vector;

/**
 * Created by Seven on 06/02/2015.
 */
public class MiAdaptador extends BaseAdapter {
    private final Activity actividad;
    private final Vector<String> elemento;
    private String TAG = "TAG Adaptador ";

 

    public MiAdaptador(Activity actividad, Vector<String> elemento){
        super();
        this.actividad = actividad;
        this.elemento= elemento;
    }

    public View getView(final int position, final View convertView, final ViewGroup parent) {

        View item = convertView;
        VistaHolder holder;

        if (item == null) {

            LayoutInflater inflater = actividad.getLayoutInflater();
            item = inflater.inflate(R.layout.listal, null, true);
            holder = new VistaHolder();
            holder.texto = (TextView) item.findViewById(R.id.titulo);
            holder.imagen = (ImageView) item.findViewById(R.id.icono);
            holder.boton = (Button) item.findViewById(R.id.botonb);
            item.setTag(holder);

        } else {
            holder = (VistaHolder) item.getTag();
        }
        holder.texto.setText(elemento.elementAt(position));
        holder.imagen.setImageResource(R.drawable.papirocerrado);

        holder.boton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int pos = (int) getItemId(position);
                Object nomitem = getItem(position);
           Log.i(TAG,"SE BORRARA EL ITEM Nº: "+Integer.toString(pos)+" NOMBRE :"+nomitem.toString());
           elemento.removeElementAt(pos);
            }
        });

        return (item);
    }

 

    public int getCount(){
        return elemento.size();
    }
    public Object getItem(int arg){
        return elemento.elementAt(arg);
    }
    public long getItemId(int position){
        return position;
    }

    static class VistaHolder{
        TextView texto;
        Button boton;
        ImageView imagen;
    }
}



Desde ya muchas gracias por tomarse el tiempo de leer. Agradezco enormemente el tiempo que ponen enseñando y ayudando a todos aquellos que lo necesitamos, espero el día de tener los conocimientos para aportar mi granito de arena.

Abrazos.

respondido por Takin Feb 8, 2015
0 votos

Hola!

Es muy simple, los ListView en Android, cuando se modifica su contenido hay que refrescar su adaptador llamando a:

Adapter.notifyDataSetChanged(); 

Con esto se refrescará y se verán los que se han eliminado. Evidentemente lo tienes que llamar justo después de modificar algún dato del adaptador.

respondido por Ramon [Admin] Feb 8, 2015
Muchas gracias por contestar. He estado intentando con el notify anteriormente pero no le encuentro la manera de usarlo correctamente. Por favor corregime si me equivoco, el notify me sirve cuando estoy modificando un elemento de la lista desde la activity principal. El problema es que la modificación la estoy haciendo dentro del adaptador ya que el botón está en el listview pero no encuentro o no entiendo la manera de usarlo desde el adaptador. Como puedo refreschar el list desde el adaptador?
No hace falta que sea desde fuera del Adapter, es más, notifyDataSetChanged() es un método del adaptador (dentro de la clase que hereda de Adapter puedes llamar a "this.notifyDataSetChanged()" para que refresque el listado). Para poder llamar algo externo (en este caso el Adapter) desde dentro del onClick explico varias maneras desde el libro gratuito en http://jarroba.com/libro-android-100-gratis/