Android: Как удалить элемент из listView и arrayAdapter
у меня есть коллекция элементов в ArrayList. Я добавляю их к адаптеру клиента следующим образом:
this.m_adapter = new MyAdapter(this, R.layout.myitem,
itemCart.m_items);
у меня есть кнопка удаления для каждого из этих элементов в моем списке, но я не уверен, как подключить кнопку удаления onClick()
с исходным элементом в ArrayList. Может кто-нибудь объяснить, как это сделать или указать мне учебник, где я могу прочитать об этом? Не-саркастические / не-снисходительные ответы очень ценятся.
8 ответов
можно назвать remove()
метод ArrayList
itemCart.m_items.remove(<index of element to remove>);
this.m_adapter.notifyDataSetChanged();
и тогда вам нужно позвонить notifyDataSetChanged();
на вашем адаптере для обновления ListView
вот мое решение до сих пор:
на getView()
метод я делаю что-то вроде этого:
deleteButton.setTag(position);
похоже getTag()
возвращает объект. Поэтому я сначала преобразовал position int в объект Integer. Похоже, это работает.
на OnClickListener()
Я делаю следующее:
items.remove(index.intValue());
пока все хорошо.
вы можете получить индекс элемента, просто заметив, что представление списка является коллекцией дочерних представлений (строк списка).
вы можете сделать что-то подобное в ваш код:
(например, внутри метода getView ())
row.setOnLongClickListener(new OnLongClickListener()
{
@Override
public boolean onLongClick(View view) {
remove(listView.indexOfChild(view));
return true;
}
}
то есть решение-просто использовать метод indexOfChild (View), чтобы получить индекс дочернего представления, который пользователь (долго) нажал.
следующие работы для меня:
/* 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();
вот мой код.
transfer.setItemPosition(position, items.get(position).getAddMode());
передача здесь является экземпляром основного класса. каждый раз, когда я нажимаю deletebutton, он затем передает позицию этого элемента в списке в этой строке.
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;
}
}
Если вы используете контекстное меню, то вы можете получить AdapterContextMenuInfo и эта структура дает индекс и идентификатор щелкнутого элемента.
Кажется, что вы можете получить индекс (или позиция) выбранного элемента в ListView следующим образом:
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listview.remove(listview.getItem(position).toString());
}
}
поэтому вам нужно прослушать клики по представлениям, а затем взять индекс из этого.
удалить по позиции:
mainAdapter.remove(mainAdapter.getItem(position));
например, последнее:
mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1));