С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
1

Как реализовать выделение элементов таблицы

30.09.2016, 20:44. Показов 595. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые знатоки, нужна ваша помощь
Имеется таблица, созданная с помощью GridLayout, элементами которой являются ImageView.
Кликните здесь для просмотра всего текста
Как реализовать выделение элементов таблицы

После реализации View.OnClickListener и регистрации слушателей для этих ImageView на них срабатывают нажатия. Но они за одно нажатие срабатывают только на одном элементе. А мне нужно за одно нажатие выделить несколько элементов (как в игре балда, когда надо выделить слово).

Как это можно реализовать?
0
Programming
Эксперт
9485 / 562 / 19
Регистрация: 12.04.2006
Сообщений: 11,671
Блог
30.09.2016, 20:44
Ответы с готовыми решениями:

Как реализовать выделение линий
Как выделить жирными линиями части кругов и касательной , как на рисунке ?

Как реализовать выделение пункта меню, на странице которого нахожусь
Добрый день дорогие пользователи. Из заголовка уже должно быть понятно что я имею ввиду. Я создаю...

Как реализовать выделение пункта меню, на странице которого нахожусь
Есть простейшее меню на html со списком и фоном. Мне для решения задачи необходимо, чтобы после...

Как реализовать заполнение таблицы
Здравствуйте Уважаемые программисты! Подскажите пожалуйста, как реализовать (с помощью какого...

11
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
30.09.2016, 22:53 2
Можно сделать свою вьюшку - гибрид ImageView и Toggle...
0
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
01.10.2016, 13:30  [ТС] 3
Цитата Сообщение от OlegJV Посмотреть сообщение
Можно сделать свою вьюшку - гибрид ImageView и Toggle...
А можно поподробнее? А то пока не очень понятно...
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
01.10.2016, 13:37 4
Цитата Сообщение от Paket236 Посмотреть сообщение
А мне нужно за одно нажатие выделить несколько элементов
каких именно элементов? вот я ткнул в середину экрана допустим, что выделять? вверх, вниз, вверз и вниз
право-лево

Добавлено через 31 секунду
и где код и разметка
0
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
01.10.2016, 13:40 5
Сделать CustomImageView extends ImageView, добавить внутрь нее OnClickListener, переменную boolean и по onClick циклически менять ее значение. Добавить для этой переменной геттер и сеттер. Можно туда же приделать интерфейс, который будет выдавать состояние переменной, а по нему уже делать что хочешь - менять цвет, фон, картинку, надпись и т.д. в зависимости выделено - не выделено.
0
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
01.10.2016, 16:28  [ТС] 6
Цитата Сообщение от Паблито Посмотреть сообщение
и где код и разметка
Кликните здесь для просмотра всего текста
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
71
72
73
74
public class MainActivity extends Activity implements View.OnClickListener, View.OnTouchListener {
 
    private GridLayout gridLayout;
    private ImageView[][] imageView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        imageView = new ImageView[12][11];
        gridLayout = (GridLayout) findViewById(R.id.gridLayout);
        gridLayout.setColumnCount(11);
 
        for(int i=0; (i<=11); i++) {
            for(int j=0; (j<=10); j++) {
                imageView[i][j] = new ImageView(this);
                gridLayout.addView(imageView[i][j]);
                imageView[i][j].setOnClickListener(this);
                imageView[i][j].setOnTouchListener(this);
                
                // Задаём отступы, размеры и фон клеток
                if(i==0 && j==0) {
                    GridLayout.LayoutParams layoutParamsRB = new GridLayout.LayoutParams();
                    layoutParamsRB.width = layoutParamsRB.height = 41;
                    layoutParamsRB.setMargins(0, 0, 2, 2);
                    imageView[i][j].setLayoutParams(layoutParamsRB);
                }
                if(i==0 && j!=0 && j<=9) {      // проходим по 0-ой строчке
                    MarginLayoutParams marginLayoutParams = new MarginLayoutParams(41, 41);
                    marginLayoutParams.setMargins(0, 0, 2, 0);
                    GridLayout.LayoutParams layoutParamsR = new GridLayout.LayoutParams(marginLayoutParams);
                    imageView[i][j].setLayoutParams(layoutParamsR);
                }
                if(i!=0 && j==0 && i<=10) {     // проходим по 0-ому столбцу
                    MarginLayoutParams marginLayoutParams = new MarginLayoutParams(41, 41);
                    marginLayoutParams.setMargins(0, 0, 0, 2);
                    GridLayout.LayoutParams layoutParamsB = new GridLayout.LayoutParams(marginLayoutParams);
                    imageView[i][j].setLayoutParams(layoutParamsB);
                }
                imageView[i][j].getLayoutParams().width = 41;
                imageView[i][j].getLayoutParams().height = 41;
                imageView[i][j].setBackgroundColor(0xFFFFFFFF);
            }
        }   
    }
 
    @Override
    public void onClick(View v) {
    }
 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // Определяем нажатый ImageView
        ImageView img = (ImageView) v;
        int stlb=0;
        int str=0;
        for(int i=0; (i<=11); i++) {
            for(int j=0; (j<=10); j++) {
                if(img == imageView[i][j]) {
                    str=i; stlb=j;
                    break;
                }
            }
        }
        
        imageView[str][stlb].setBackgroundColor(0xFFC1D8FF);
        
        if(event.getAction()==MotionEvent.ACTION_UP) {
            imageView[str][stlb].setBackgroundColor(0xFFFFFFFF);
        }
        return false;
    }
}


Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:gravity="center"
    android:background="#fff"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >          
    <GridLayout
        android:id="@+id/gridLayout"
        android:layout_gravity="center"
        android:background="#FF59BEEC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </GridLayout>
</LinearLayout>


Цитата Сообщение от Паблито Посмотреть сообщение
вот я ткнул в середину экрана допустим, что выделять? вверх, вниз, вверз и вниз
право-лево
Как в игре "Балда", выделять соседние клетки, по горизонтали и вертикали. А какие именно выделять, зависит от содержимого клетки (допустим, иметь ещё один массив String[][] (в дополнение к ImageView[][]), в котором будут храниться буквы).
Цитата Сообщение от OlegJV Посмотреть сообщение
Сделать CustomImageView extends ImageView
Спасибо, попробую. Правда пока непонятно, как это сработает...

Добавлено через 53 минуты
OlegJV, а Вы можете показать на моём примере?
0
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
01.10.2016, 16:35 7
Paket236, что именно показать?
0
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
01.10.2016, 16:43  [ТС] 8
OlegJV, я не понял фразу "и по onClick циклически менять ее значение" и как это поможет выделению элементов таблицы.

Добавлено через 3 минуты
Я ещё раз уточню, что элементы должны выделяться за одно нажатие, а не за несколько.
0
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
01.10.2016, 16:56 9
Ты тыкаешь на свою CustomImageView. У нее срабатывает метод onClick. Внутри нее есть переменная, допустим boolean checked. Если она была false, то становится true и наоборот. Кроме этого делаешь внутри CustomImageView методы cetChecked и getChecked, меняющие значение checked. Так же по onClick срабатывает интерфейс и выдает в активити значение переменной checked. Активити (в зависимости от значения переменной) в цикле проверяет значения соседних клеток и выставляет им setChecked какой тебе нужно.

Добавлено через 1 минуту
Объяснять подробнее - это значит написать программу за тебя.
0
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
02.10.2016, 00:34  [ТС] 10
Цитата Сообщение от OlegJV Посмотреть сообщение
Активити (в зависимости от значения переменной) в цикле проверяет значения соседних клеток и выставляет им setChecked какой тебе нужно.
А как эти значения попадут в соседние клетки? Либо я тебя не понимаю, либо ты меня. Ещё раз поясню задачу. Я тыкнул пальцем в клетку, затем, не отпуская палец, провёл на соседнюю клетку. Что должно произойти? Обе клетки должны, например, изменить цвет. Что происходит? Меняет цвет только первоначально нажатая. А то, что я пальцем провёл в другую клетку - об этом никакой информации нет (хотя, есть координаты, которые можно получить с помощью event.getX(), но, по-моему, это плохое решение).
На другом форуме мне порекомендовали отказаться от лэйаутов и рисовать таблицу на Canvas (пока не очень представляю, как это реализовать).
0
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
02.10.2016, 01:57 11
Цитата Сообщение от Paket236 Посмотреть сообщение
на них срабатывают нажатия
Цитата Сообщение от Paket236 Посмотреть сообщение
не отпуская палец, провёл на соседнюю клетку
Цитата Сообщение от Paket236 Посмотреть сообщение
Либо я тебя не понимаю, либо ты меня
Ты сам себя-то понимаешь? То на нажатия надо реагировать, то на перемещения пальца... Определяйся уже.
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
02.10.2016, 09:17 12
Таблица ведь без скрола? Если да - можно сам GridLayout повесить OnTouch листенер и в ивенте MOVE брать координаты касания, а потом по ним искать картинку и вызывать у нее какой-нибудь метод, который ее перекрасит.
1
02.10.2016, 09:17
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
02.10.2016, 09:17
Помогаю со студенческими работами здесь

Как реализовать заполнение таблицы?
Здравствуйте. Помогите пожалуйста, уже тритий день мучаюсь, никак не могу создать скрипт....

Как правильно реализовать таблицы
Есть &quot;Блюда&quot; у которых имеются различные &quot;Составы&quot; в каждый из которых входят различные...

Как реализовать хранение таблицы
Добрый день! Есть данные в виде таблицы с строковыми и числовыми полями. Мне нужно производить...

UPDATE таблицы, как лучше реализовать?
Есть таблица такого вида (в ней храниться информация о товарах интернет магазина) |id|...{some...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Блоги программистов
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­хронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru