Android studio listview удаление с помощью контекстного меню

Полный список

— используем SimpleAdapter для построения списка
— добавляем и удаляем записи в списке

Как выводить данные в список с помощью SimpleAdapter мы знаем. Теперь попробуем эти данные менять. Сделаем список с возможностью удаления и добавления записей. Добавлять будем кнопкой, а удалять с помощью контекстного меню.

Project name: P0511_SimpleAdapterData
Build Target: Android 2.3.3
Application name: SimpleAdapterData
Package name: ru.startandroid.develop.p0511simpleadapterdata
Create Activity: MainActivity

Кнопка для добавления и список. Из интересного можно отметить свойство onClick у кнопки. Дальше станет понятно, что это.

Layout для пункта списка item.xml:

Картинка и текст.

В методе onCreate мы формируем коллекцию Map-объектов, массивы сопоставления, создаем адаптер и список, добавляем возможность контекстного меню для списка.

Метод onButtonClick – его мы указали в main.xml в свойстве onClick кнопки. И теперь при нажатии на кнопку выполнится этот метод. Отдельный обработчик нажатия не нужен.

В этом методе мы создаем новый Map, добавляем его к коллекции данных и сообщаем, что данные изменились и надо обновить список.

Метод onCreateContextMenu – создание контекстного меню. Создаем только один пункт — для удаления записи.

В onContextItemSelected обрабатываем нажатие на пункт контекстного меню. При вызове контекстного меню объект, для которого оно было вызвано, передает в меню информацию о себе. Чтобы получить данные по пункту списка, для которого был совершен вызов контекстного меню, мы используем метод getMenuInfo. Объект AdapterContextMenuInfo содержит данные о View, id и позиции пункта списка. Мы используем позицию для удаления соответствующего Map из коллекции. После этого сообщаем, что данные изменились.

Все сохраним и запустим.

На скрине показано контекстное меню, которое вызывается при долгом нажатии на пункт списка. За ним виден список и кнопка для добавления записей.

Записи добавляются и удаляются. Редактирование я не стал делать. Там принцип тот же. Получаете Map и меняете его атрибуты.

Из кода видно, что для обновления списка надо поменять данные, которые использует адаптер, и вызвать его метод-уведомление.

На следующем уроке:

— используем SimpleCursorAdapter для построения списка
— добавляем и удаляем записи в списке

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Android: Как удалить элемент из listView и arrayAdapter

у меня есть коллекция элементов в ArrayList. Я добавляю их к адаптеру клиента следующим образом:

Читайте также:  Простой блокнот андроид без рекламы

у меня есть кнопка удаления для каждого из этих элементов в моем списке, но я не уверен, как подключить кнопку удаления onClick() с исходным элементом в ArrayList. Может кто-нибудь объяснить, как это сделать или указать мне учебник, где я могу прочитать об этом? Не-саркастические / не-снисходительные ответы очень ценятся.

8 ответов

можно назвать remove() метод ArrayList

и тогда вам нужно позвонить notifyDataSetChanged(); на вашем адаптере для обновления ListView

вот мое решение до сих пор:

на getView() метод я делаю что-то вроде этого:

похоже getTag() возвращает объект. Поэтому я сначала преобразовал position int в объект Integer. Похоже, это работает.

на OnClickListener() Я делаю следующее:

пока все хорошо.

вы можете получить индекс элемента, просто заметив, что представление списка является коллекцией дочерних представлений (строк списка).

вы можете сделать что-то подобное в ваш код:

(например, внутри метода getView ())

то есть решение-просто использовать метод indexOfChild (View), чтобы получить индекс дочернего представления, который пользователь (долго) нажал.

следующие работы для меня:

передача здесь является экземпляром основного класса. каждый раз, когда я нажимаю deletebutton, он затем передает позицию этого элемента в списке в этой строке.

Если вы используете контекстное меню, то вы можете получить AdapterContextMenuInfo и эта структура дает индекс и идентификатор щелкнутого элемента.

Кажется, что вы можете получить индекс (или позиция) выбранного элемента в ListView следующим образом:

поэтому вам нужно прослушать клики по представлениям, а затем взять индекс из этого.

Источник

Полный список

В этом уроке мы:

— создадим контекстное меню

Контекстное меню вызывается в Андроид длительным нажатием на каком-либо экранном компоненте. Обычно оно используется в списках, когда на экран выводится список однородных объектов (например письма в почт.ящике) и, чтобы выполнить действие с одним из этих объектов, мы вызываем контекстное меню для него. Но т.к. списки мы еще не проходили, сделаем пример попроще и будем вызывать контекстное меню для TextView.

Project name: P0151_ContextMenu
Build Target: Android 2.3.3
Application name: ContextMenu
Package name: ru.startandroid.develop.contextmenu
Create Activity: MainActivity

Откроем main.xml и нарисуем там два TextView:

Для первого TextView мы сделаем контекстное меню, с помощью которого будем менять цвет текста. Для второго – будем менять размер текста.

Принцип создания контекстного меню похож на создание обычного меню. Но есть и отличия.

Метод создания onCreateContextMenu вызывается каждый раз перед показом меню. На вход ему передается:

ContextMenu, в который мы будем добавлять пункты
View — элемент экрана, для которого вызвано контекстное меню
ContextMenu.ContextMenuInfo – содержит доп.информацию, когда контекстное меню вызвано для элемента списка. Пока мы это не используем, но, когда будем изучать списки, увидим, что штука полезная.

Метод обработки onContextItemSelected аналогичный методу onOptionsItemSelected для обычного меню. На вход передается MenuItem – пункт меню, который был нажат.

Также нам понадобится третий метод registerForContextMenu. На вход ему передается View и это означает, что для этой View необходимо создавать контекстное меню. Если не выполнить этот метод, контекстное меню для View создаваться не будет.

Читайте также:  Сканворды крепость для андроид

Давайте кодить, открываем MainActivity.java. Опишем и найдем TextView и укажем, что необходимо создавать для них контекстное меню.

Теперь опишем создание контекстных меню. Используем константы для хранения ID пунктов меню.

Обратите внимание, что мы по ID определяем View, для которого вызвано контекстное меню и в зависимости от этого создаем определенное меню. Т.е. если контекстное меню вызвано для tvColor, то мы создаем меню с перечислением цветов, а если для tvSizeс размерами шрифта.

В качестве ID пунктов мы использовали константы. Группировку и сортировку не используем, поэтому используем нули в качестве соответствующих параметров.

Можно все сохранить и запустить. При долгом нажатии на TextView должны появляться контекстные меню.

Но нажатие на них ничего не дает, т.к. мы не прописали обработку в методе onContextItemSelected. Давайте пропишем:

В этом методе мы определяем по ID, какой пункт меню был нажат. И выполняем соответствующие действия: меняем цвет текста для tvColor или размер шрифта для tvSize. Сохраняем, запускаем и проверяем, что контекстные меню теперь реагируют на нажатия и делают то, что от них требуется.

Для расширения кругозора я хотел бы еще кое-что написать по этой теме. Возможно, это покажется пока сложноватым, так что если вдруг будет непонятно, ничего страшного. Итак, мысли вслух.

Мы использовали метод registerForContextMenu (View view) для включения контекстного меню для определенного View. Этот метод принадлежит классу Activity. Я посмотрел исходники этого метода, там написано следующее:

Вспоминаем наш урок по обработчикам и смотрим хелп по методу setOnCreateContextMenuListener (View.OnCreateContextMenuListener l). Получается, что View в качестве обработчика создания контекстного меню использует объект this. В данном случае, этот код в Activity, значит this – это Activity и есть. Т.е. когда View хочет показать контекстное меню, оно обращается к обработчику (Activity), а он уже выполняет свой метод onCreateContextMenu. Т.е. тот же самый принцип, что и при обычном нажатии (Click).

И строка в MainActivity.java:

абсолютно равнозначна этой строке:

Вообще мы можем создать свой объект, реализующий интерфейс View.OnCreateContextMenuListener и использовать его вместо Activity в качестве обработчика создания контекстного меню.

Не забывайте, что для контекстного меню вы также можете использовать XML-способ, который был рассмотрен в конце прошлого урока. Попробуйте сделать этот же урок, но уже с использованием XML-меню.

Полный код урока:

На следующем уроке:

— рисуем экран программно, а не через layout-файл

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

Читайте также:  Как восстановить андроид asus

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Android Lesson 12. Контекстное меню.

В предыдущем примере мы работали со списком элементов. Если операцию в приложении нужно выполнить, учитывая сведения об ее окружении (контексте), то удобно воспользоваться контекстным меню. Контекстное меню появляется при длительном удерживании пальца на компоненте. Далее на экране появляется панель с возможными действиями, например удаление элемента или добавлением его в список избранного.

Создание контекстного меню очень похоже на создание обычного. Сначала мы определяем файл меню.

Содержимое list_item_context.xml.

Затем пользуемся методом onCreateContextMenu().

В нем мы все также вызываем метод inflate() класса MenuInflater для заполнения объекта ContextMenu. Для обработки нажатий на элементы контекстного меню существует метод onContextItemSelected().

Здесь мы в операторе switch проверяем, какой из элементов был нажат и выполняем соответствующие действия. В тестовом примере вместо выполнения реальных действий выводим на экран всплывающее сообщение с информацией о том, какой пункт меню был выбран.

Но если запустить приложение сейчас, то ничего не заработает. Почему? Контекстное меню необходимо зарегистрировать для того компонента, для которого оно создано. Например, это ListView из прошлого урока. Вызываем метод registerForContextMenu(View v):

Источник

Удалить элементы ListView в Android

Может кто-нибудь, пожалуйста, дать мне пример кода удаления всех элементов ListView и замены на новые элементы?

Я попытался заменить элементы адаптера без успеха. Мой код

Здесь метод repopulateList() будет добавлять элементы ListView, но не удаляет / не заменяет все элементы ListView.

Вы захотите remove() элемент из объекта адаптера, а затем просто запустите notifyDatasetChanged() на адаптере, любой ListView будет (должен) перерабатывать и обновлять самостоятельно.

Ниже приведен краткий пример активности с AlertDialog s:

Вы можете использовать

Который удалит все элементы вашего первого адаптера, тогда вы можете либо установить другой адаптер, либо повторно использовать адаптер, либо добавить элементы в старый адаптер. Если вы используете

Для добавления данных в ваш список вам не нужно вызывать notifyDataSetChanged

Я думаю, что если вы добавите следующий код, он будет работать

Чтобы удалить элемент, просто удалите этот элемент из arraylist, который мы передали адаптеру, и выполните listview.invalidateViews();
Это обновит список

Затем вызовите notifyDataSetChanged();

Удалите его из адаптера, а затем уведомите массив, который изменил набор данных.

Этот код отлично работает для меня.

  • Вы должны использовать только один адаптер, связанный со списком данных, который вам нужно перечислить
  • Когда вам нужно удалить и заменить все элементы, вам необходимо очистить все элементы из списка данных, используя «list.clear ()», а затем добавить новые данные, используя «list.addAll (List)»

Попробуйте этот код, он работает для меня.

Сначала вы должны удалить элемент из своего списка. Позже вы можете удалить свой адаптер и пополнить его новым списком.

Это просто. Сначала вы должны очистить свою коллекцию и после четкого списка, как этот код:

Источник

Оцените статью