Android: cómo eliminar un elemento de una listaVer y arrayAdapter
Tengo una colección de artículos en un ArrayList. Los agrego a un adaptador de cliente de la siguiente manera:
this.m_adapter = new MyAdapter(this, R.layout.myitem, itemCart.m_items);
Tengo un botón de borrado para cada uno de estos elementos en mi lista, pero no estoy seguro de cómo conectar onClick()
del botón delete con el elemento original en ArrayList. ¿Puede alguien explicar por favor cómo hacer esto o señalarme un tutorial donde puedo leer sobre esto? Las respuestas no sarcásticas / no condescendientes son muy apreciadas.
- Cómo obtener el valor del objeto desde la posición del adaptador de listview
- ¿Cómo puedo obtener mi ListView para desplazarse?
- Cómo obtener id de un elemento particular de listview en android?
- MVVMCross Obtener SelectedItem de un MvxBindableListView
- Resaltar el elemento seleccionado en ListView en Android
- ListView animar elemento único
- Android: headerDividersEnabled no funciona
- ListView: setItemChecked sólo funciona con ArrayAdapter estándar - NO funciona cuando se utiliza ArrayAdapter personalizado?
- Cómo obtener la miniatura de Android Contact
- Listview duplica el elemento cada 6 veces
- Cómo poner listview dentro de un fragmento
- ListAdapter Filtro que no sea el uso de cadenas?
- ListView ya no reacciona a onclick después de una llamada a setSelection ()
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 llamar a notifyDataSetChanged();
En su adaptador para actualizar el ListView
Aquí está mi solución hasta ahora:
En el método getView()
hago algo como esto:
deleteButton.setTag(position);
Parece que getTag()
devuelve un objeto. Así que convirtió la posición int en un objeto entero primero. Parece estar funcionando.
En el OnClickListener()
hago lo siguiente:
items.remove(index.intValue());
Hasta aquí todo bien.
Puede obtener el índice del elemento simplemente notando que una vista de lista es una colección de vistas secundarias (las filas de la lista).
Puedes hacer algo como esto en tu 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 utilizar el método indexOfChild (View) para obtener el índice de la vista secundaria que el usuario (largo) presionó.
Siguientes trabajos 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();
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 delete, pasa la posición del elemento en la lista de 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; } }
Si utiliza el menú contextual, entonces puede obtener AdapterContextMenuInfo y esta estructura proporciona el índice y el ID del elemento seleccionado.
Parece que puede obtener el índice (o posición) de un elemento seleccionado 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()); } }
Así que necesitas escuchar los clics en Views y luego tomar el índice de eso.
Eliminar por posición:
mainAdapter.remove(mainAdapter.getItem(position));
Tal como el último:
mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1));
- ¿Cómo aplicar la transición 3d entre dos actividades en android?
- Cómo obtener color en el punto (o píxel) de una imagen en evento táctil en android