Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 116

Listview, adapter получение информации из нажатого элемента списка

28.01.2017, 01:13. Показов 5362. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть список, который заполняется из базы данных. Мне нужно через контекстное меню удалить этот элемент из списка и исходя из информации, которая содержится в списке изменить данные в БД. Для этого мне нужно из элемента списка получить некоторые значения, которые он отображает. Я понял, что это делается через id элемента списка, но запутался в том, как с помощью него получить необходимые данные, которые отображаются в этом элементе... Подскажите пожалуйста.
Вообще я пытался сделать по этому примеру... Но у меня есть отличия:

1. Мне не нужен массив элементов, т.к. каждый элемент списка представляет собой один билет, который содержит номер рейса и место, который забронировал пользователь. Через контекстное меню надо отменить эту бронь, соотвественно нужно получить номер рейса и номер места, для того, что бы это место отметить в БД как доступное для бронирования.

2. Более важный момент, я не могу ни внутри адаптера ни в классе, которое работает с этим списком воспользоваться переопределенным методом получения id.

В итоге я запутался как это сделать. В идеале оно должно работать так:
1.Создается список и заполняется данными из БД.
2.По нажатию на определенный элемент появляется контекстное меню, через которое я нажимаю на пункт "Отменить бронирование".
3.Программа извлекает из этого поля все данные, для того чтобы в БД правильно отменить бронь. После чего список пересоздается, но уже без этого элемента.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.01.2017, 01:13
Ответы с готовыми решениями:

Получение информации из чужого listview
Здравствуйте, столкнулся с проблемой, необходимо из listview как в диспетчере задач получить строки с подэлементами. Пробовал просто...

ListView и получение списка папок
Есть серверная часть игры, надо написать утилиту, есть папка в директории сервера Accounts, в ней папки с логинами юзеров, мне надо...

Получение элемента из ListView
Всем привет. Появилась проблема с получение элемента из listview. И так, начну с того, как у меня заносятся элементы в этот listview ...

5
 Аватар для OlegJV
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
28.01.2017, 06:39
Добавить в адаптер интерфейс.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
28.01.2017, 08:21
OlegJV, зачем?
Eugen167, если вы как-то попали на элемент то у вас есть его позиция - по этой позиции вы можете получить содержимое, предпринять необходимые действия (уведомить внешний агент об удалении), удалить элемент и уведомить список об изменении данных. Все это проще сделать когда список строится при помощи вашего адаптера. Код где?
0
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
28.01.2017, 08:24
Наверное как то так. Ткнули на списке получили номер позиции на которую ткнули.
По номеру позиции можно получить ItemId в методе public long getItemId(int position) и сам Item в методе public Object getItem(int position)
Ваш Item должен представлять собой объект где будет информация о рейсе бронировании времени и тд, но обязательно исчо и _id номера записи в БД. Если надо запись в БД корректировать то это можно сделать по _id записи в БД.
1
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 116
28.01.2017, 14:51  [ТС]
vxg, Alex_Fedor,
Суть в том, что эти все методы у меня есть, но как ими воспользоваться? Они недоступны....
Вот код адаптера:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class prof_adapter extends BaseAdapter {
    Context ctx;
    LayoutInflater lInflater;
    ArrayList<prof_tick> objects;
 
    prof_adapter(Context context, ArrayList<prof_tick> prof_tick) {
        Log.i("prof_adapter", "Конструктор");
        ctx = context;
        objects = prof_tick;
        lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
 
    // кол-во элементов
    @Override
    public int getCount() {
        Log.i("prof_adapter", "Количество элементов");
        return objects.size();
    }
 
    // элемент по позиции
    @Override
    public Object getItem(int position) {
        Log.i("prof_adapter", "Элементо по позиции");
        return objects.get(position);
    }
 
    // id по позиции
    @Override
    public long getItemId(int position) {
        Log.i("prof_adapter", "id по позиции");
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // используем созданные, но не используемые view
        Log.i("prof_adapter", "public View getView");
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.list_profile, parent, false);
        }
        Log.i("prof_adapter", "Time_Table p = getProduct");
        prof_tick p = getProduct(position);
 
        // заполняем View в пункте списка данными из товаров: наименование, цена
        // и картинка
        ((TextView) view.findViewById(R.id.id_flight)).setText(p.id_flight);
        ((TextView) view.findViewById(R.id.num_seat)).setText(p.num_seat);
        ((TextView) view.findViewById(R.id.name_class)).setText(p.name_class);
 
        Log.i("TimeAdapter", "заполняем View");
        return view;
    }
 
    // товар по позиции
    prof_tick getProduct(int position) {
        Log.i("prof_adapter", "товар по позиции");
        return ((prof_tick) getItem(position));
    }
 
    static ArrayList<prof_tick> getBox() {
        Log.i("prof_adapter", );
        
       ArrayList<prof_tick> box = new ArrayList<prof_tick>();
 
       //box.add();
       return box;
    }
}
Вот код кнопки контекстного меню:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, CM_DELETE_ID, 0, "Отменит бронь");
    }
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_DELETE_ID) {
            // получаем инфу о пункте списка
            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
            // удаляем Map из коллекции, используя позицию пункта в списке
           //showResult();
            //data.remove(acmi.position);
            // уведомляем, что данные изменились
            //sAdapter.notifyDataSetChanged();
            for ( prof_tick p: prof_adapter.getBox()) {
                Log.i("t_table", "Номер рейса" + p.id_flight);
 
            }
            return true;
        }
        return super.onContextItemSelected(item);
    }
Добавлено через 1 час 0 минут
Я немного покопался... и Вот что получилось:
Java
1
2
3
4
5
6
7
8
9
10
public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_DELETE_ID) {
            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
            Log.i("t_table", "Позиция - " + acmi.position);
            Object obj = adapter.getItem(acmi.position);
            Log.i("t_table", "getItemId - " + obj);
            return true;
        }
        return super.onContextItemSelected(item);
    }
В консоли выводится примерно такое:
I/t_table: getItemId - Номер рейса: 20 Номер места: 1 Класс: Эконом

Но я не могу получить все эти значения отдельно... и все...

Добавлено через 31 минуту
Разобрался почему так происходит. В классе у меня прописана такая форма возвращения объекта:

@Override
public String toString() {
return "Номер рейса: "+id_flight+" Номер места: "+num_seat+" Класс: "+name_class;
}

А как сделать, что бы я мог получать эти переменные отдельно? Я пробовал использовать Map, там есть ключи, что позволило бы легко обращаться к переменным, но не получилось...
0
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
29.01.2017, 09:11
Нет ничего хуже чем разбирать чужой код, тем более обрывки.
objects = prof_tick;
надо заменить на
object=new ArrayList<prof_tick>;
for (prof_tick pf_tk : prof_tick) {
object.add(pf_tk);
}
Класс prof_tick должен быть приблизительно такого вида.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class DataForFolder {// этот класс хранилище данных для описания и отображения наподобии структуры в Си
        File file;//путь к файлу 
        //String nameFolderOrFile;//имя отображаемой папки или файла
        int level;// уровень вложения папки или файла
        boolean open;//если папка открыта то труе, если папака закрыта то фальсе
        int idRecordIntoDB;//_id записи в БД
        public DataForFolder(File file,int level, boolean open,int idRecordIntoDB) {
            // TODO Auto-generated constructor stub
            this.file=file;
            //this.nameFolderOrFile=nameFolderOrFile;
            this.level=level;
            this.open=open;
            this.idRecordIntoDB=idRecordIntoDB;
        }
}
Про меню и контекстное меню пока забудьте. Повесьте на ваш ListView OnItemClickListener. И попробуйте выдернуть вашу информацию в методе onItemClick
через объект вашего prof_adapter prof_adapter.getItem(int position)
П.С. В коде могут быть ошибки. Они там обязательно есть.

Добавлено через 2 часа 2 минуты
Цитата Сообщение от Eugen167 Посмотреть сообщение
Вот код кнопки контекстного меню:
Немного не понятно, зачем на кнопку контекстное меню вешать. Если ваша кнопка входит в состав view. То и делайте обработку при нажатии на кнопку. Код такой.
В адаптере
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        if(convertView == null){
            convertView = layoutInflater.inflate(R.layout.my_list_item_btn,parent,false);//загрузили view
        }
        TextView txtView=(TextView) convertView.findViewById(R.id.tvOut);//нашли  TextView txtView
        txtView.setText(object.get(position));//вывели в txtView текст 
        Button btnDel = (Button) convertView.findViewById(R.id.btnDel);//нашли Button btnDel
        btnDel.setTag(position);//присвоили тег, чтобы знать вкакой позиции нажали кноку
        btnDel.setFocusable(false);//убрали фокус иначе у ListView в MainActivity не будет работать метод onItemClick
        btnDel.setOnClickListener(listener);
        return convertView;
    }
В МаинАктивити обработка нажатия кнопки
Java
1
2
3
4
5
6
7
public void onClick(View v) { //обработка нажатия кнопок
        // TODO Auto-generated method stub
case R.id.btnDel://нажали  Х ,кнопочку удаления записи 
            int position=Byte.valueOf(v.getTag().toString());// вычислили позицию в таблице на которой нажали кнопочку
            по int position можно вытащить из адаптера Object getItem(int position) а в
Object должно ыть прописано все что вам нужно для редактирования БД.
            break;
Не уверен но по такому же принципу можно и контекстное меню сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.01.2017, 09:11
Помогаю со студенческими работами здесь

ListView и простой пример определения нажатого пункта
Здравствуйте! Брошу на лайоут ListView и Button Набью на listView две строчки - &quot;Москва&quot;, &quot;Питер&quot;. Как определить...

Получение элемента listView в AlertDialog
Добрый день форумчане, подскажите как реализовать следующее событие. Имеется listview, который состоит из нескольких компонентов (3...

Получение значения выделенного элемента ListView
На форме есть ListView (LV1) и есть RichTextBox (Crit). Нужно по Click-у на элементе списка, его текстовое содержимое отправить в...

Оформление элемента списка ListView
Здравствуйте. Подскажите, как можно добиться результата, показанного на рисунке 1 (это в Paint подрисовано :) ) У меня сейчас выглядит...

Добавление элемента в начало списка ListView
Добрый день! Подскажите, пожалуйста, как добавить элемент в начало списка TreeView? В вариантах ListView.Add(new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru