2011-01-15 17 views
11

Tengo una colección de elementos en una ArrayList. Los agrego a un adaptador de cliente de la siguiente manera:Android: cómo eliminar un elemento de una listaView y arrayAdapter

this.m_adapter = new MyAdapter(this, R.layout.myitem, 
    itemCart.m_items); 

que tienen un botón de borrado para cada uno de estos artículos en mi lista, pero no estoy seguro de cómo conectar de onClick() el botón de borrado con el elemento original en el ArrayList . ¿Puede alguien explicar cómo hacerlo o dirigirme a un tutorial donde pueda leer sobre esto? Las respuestas no sarcásticas/no condescendientes son muy apreciadas.

Respuesta

7

Aquí está mi solución hasta el momento:

En el Método getView() Hago algo como esto:

deleteButton.setTag(position); 

Parece que getTag() devuelve un objeto. Así que convertí la posición int en un objeto Integer primero. Parece estar funcionando.

En el OnClickListener() hago lo siguiente:

items.remove(index.intValue()); 

Hasta ahora, todo bien.

+0

Entonces, sin las etiquetas, ¿no tiene idea en qué botón se hace clic? Me parece que has pasado por alto algún mecanismo para resolverlo. Piensa en usar el padre del botón. – jcuenod

25

Usted puede llamar al método remove() en su ArrayList

itemCart.m_items.remove(<index of element to remove>); 
this.m_adapter.notifyDataSetChanged(); 

Y entonces usted necesita para llamar notifyDataSetChanged(); en el adaptador para actualizar el ListView

+0

Sí, pero mi problema es encontrar la manera de especificar el índice para ese artículo? Creo que necesito usar setTag() originalmente y luego getTag() antes de eliminarlo, pero me gustaría ver algún código de muestra si es posible. Gracias de nuevo. – gonzobrains

+0

Tengo un menú contextual en un ListView con un botón de borrar que me permite usar el elemento que esencialmente es 'item.getMenuInfo(). Id' (no es tan simple). Sin duda, tus botones tienen índices. – jcuenod

0

Si utiliza el menú contextual, puede obtener AdapterContextMenuInfo y esta estructura proporciona el índice y la identificación del elemento cliqueado.

+2

pero no el ID de la base de datos. – Mikey

5

Puede obtener el índice del elemento simplemente observando que una vista de lista es una colección de vistas secundarias (las filas de la lista).

se puede hacer algo como esto en su código:

(dentro del método getView(), por ejemplo)

row.setOnLongClickListener(new OnLongClickListener() 
{ 
    @Override 
    public boolean onLongClick(View view) { 
     remove(listView.indexOfChild(view)); 
     return true; 
    } 
} 

Es decir, la solución es simplemente usar el método indexOfChild (Ver) para obtener índice de vista infantil que el usuario (largo) presionó.

1

Aquí está mi código.

transfer.setItemPosition(position, items.get(position).getAddMode()); 

la transferencia aquí es la instancia de la clase principal. cada vez que hago clic en el botón Eliminar, luego paso la posición de ese elemento en la lista en esta línea.

public View getView(final int position, View convertView, ViewGroup parent) { 
      View v = convertView; 
      if (v == null) { 
       final Context context = getContext(); 
        LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        v = vi.inflate(R.layout.listviewitem_layout, null); 
      } 

      ItemEntry item = items.get(position); 
      if (item != null) { 
        TextView textViewName = (TextView) v.findViewById(R.id.textViewItemName); 
        ImageView imageViewDelete = (ImageView) v.findViewById(R.id.imageViewDeleteIcon); 

        imageViewDelete.setOnClickListener(new View.OnClickListener() { 
         public void onClick(View v) {     
           transfer.showDialog(4);        
           transfer.setItemPosition(position, items.get(position).getAddMode()); 
         } 
        }); 

      if (textViewName != null) { 
        textViewName.setText(item.getItemName()); 
      } 

      if(imageViewDelete != null) { 
       imageViewDelete.setImageResource(R.drawable.delete); 
      } 
     } 
     return v; 
     } 
} 
3

siguiente funciona para mí:

/* Read values from resource into an array */ 
String[] strColorValues = getResources().getStringArray(R.array.colors); 

ArrayList<String> list = new ArrayList<String>(); 
for (int i = 0; i < strColorValues.length; i++) { 
    list.add(strColorValues[i]); 
} 

ArrayAdapter adapterColors = new ArrayAdapter(getActivity(), android.R.layout.simple_spinner_item, list); 

adapterColors.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

spinnerColors.setAdapter(adapterPermissionLevels); 
spinnerColors.setOnItemSelectedListener(this); 

/* Remove first element from the adapter and notify dataset changed. */ 
String item = spinnerColors.getItemAtPosition(0).toString(); 
adapterColors.remove(item); 
adapterColors.notifyDataSetChanged(); 
0

Parece que se puede obtener el índice (o posición) de un elemento hecho clic en el ListView de la siguiente manera:

listview.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     listview.remove(listview.getItem(position).toString()); 
    } 
} 

Por lo que necesita escuchar los clics en Vistas y luego tomar el índice de eso.

0

Quitar por posición:

mainAdapter.remove(mainAdapter.getItem(position)); 

Tales como la última:

mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1)); 
Cuestiones relacionadas