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

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

28.01.2017, 01:13. Показов 5407. Ответов 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
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
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
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru